2012-10-31 25 views
2

在下面的示例表中,我試圖找出一種方法來將所有標記中的標記「C」不存在於標識內。當標記'C'確實存在於一個id中時,我想要通過該id的金額總和,不包括相對於標記'A'的金額。如圖所示,我的期望輸出在底部。我已經考慮過使用分區和EXISTS命令,但是我在解決方案的概念化方面遇到了問題。如果你們可以看看,並指出我在正確的方向,將不勝感激:)如果存在另一個組中的記錄,則排除其中的記錄值

示例表:

id mark amount 
------------------ 
1 A  1 
2 A  3 
2 B  2 
3 A  2 
4 A  1 
4 B  3 
5 A  1 
5 C  3 
6 A  2 
6 C  2 

所需的輸出:

id sum(amount) 
----------------- 
1 1 
2 5 
3 2 
4 4 
5 3 
6 2 

回答

0
select 
    id, 
    case 
    when count(case mark when 'C' then 1 else null end) = 0 
    then 
     sum(amount) 
    else 
     sum(case when mark <> 'A' then amount else 0 end) 
    end 
from sampletable 
group by id 
+0

你的第二個'sum'可能應該是:'sum(當mark <>'A'then amount else 0 end時)'(應該是'amount'而不是'1')。 –

+0

@AndriyM突如其來的錯誤。修正了它 –

+0

@Adrian,謝謝你的回覆。實施你的解決方案後,我意識到我問了這個問題錯了!這個解決方案完全符合我的要求,但是我要求的並不是我所需要的:)。如果你有足夠的心去做這件事,我已經在[link](http://stackoverflow.com/questions/13169830/exclude-value-of-a-record-in)上提出了一個與我的實際需求有關的新問題-a基團如果-另一個-是至今-V2) –

0

這是我的努力:

select id, sum(amount) from table t where not t.id = 'A' group by id 
having id in (select id from table t where mark = 'C') 
union 
select id, sum(amount) from table t where t.id group by id 
having id not in (select id from table t where mark = 'C') 
0
SELECT 
    id, 
    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 
    id 
; 
相關問題