1

在下面的示例表中,我试图找出一种在两种情况下对标记求和的方法:第一种,当标记“C”存在于单个 id 中时,第二种,当标记“C”不存在时存在于一个 id 中(参见 id 1 或 2)。在第一种情况下,我想在该 id 中排除标记“A”的金额(请参阅下面所需转换表中的 id 3)。在第二种情况下,我想不执行排除操作,而是对分数进行简单的总和。

换句话说,对于同时包含标记“A”和“C”的 id,我想将“A”的金额设为零。对于不包含标记“C”但包含标记“A”的 id,请保留原始数量与标记“A”相对应。

我想要的输出在底部。我考虑过尝试对 id 进行分区或使用 EXISTS 命令,但我在概念化解决方案时遇到了麻烦。如果你们中的任何人都可以看看并指出我正确的方向,将不胜感激:)

示例表:

id   mark  amount
------------------
1    A     1
2    A     3
2    B     2
3    A     1
3    C     3

所需的转换:

id   mark  amount
------------------
1    A     1
2    A     3
2    B     2
3    A     0
3    C     3

所需的输出:

mark    sum(amount)
--------------------
A       4
B       2
C       3
4

2 回答 2

1

您可以稍微修改我之前的答案并最终得到以下结果:

SELECT
  mark,
  sum(amount) AS sum_amount
FROM atable t
WHERE mark <> 'A'
  OR NOT EXISTS (
    SELECT *
    FROM atable
    WHERE id = t.id
      AND mark = 'C'
  )
GROUP BY
  mark
;

SQL Fiddle上有一个现场演示。

于 2012-11-01T06:46:45.740 回答
0

尝试:

select
    mark,
    sum(amount)
from ( select
        id,
        mark,
        case 
            when (mark = 'A' and id in (select id from table where mark = 'C')) then 0
            else amount
        end as amount
    from table ) t1
group by mark
于 2012-11-01T02:28:25.837 回答