如果存在另一个记录,则排除组中记录的值v2

时间:2012-11-01 01:35:42

标签: sql oracle

在下面的示例表中,我试图找出一种方法来在两种情况下对标记求金额:第一种,当标记'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

2 个答案:

答案 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