在下面的示例表中,我试图找出一种方法来在两种情况下对标记求金额:第一种,当标记'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
答案 0 :(得分:1)
您可以稍微修改my previous answer并最终得到:
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
;
有一个现场演示at SQL Fiddle。
答案 1 :(得分: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