2015-09-01 62 views
0

我需要從同一個表中獲取查詢結果的差異。獲取同一表中兩個和的差值

例:myTable的

id code  status  amount 
1  A  active  250 
2  A  active  200 
3  B  active  300 
4  B  active  100 
5  A  active  100 
6  C  active  120 
7  C  active  200 

我想量的總或總和每個代碼(添加如果活躍,減如果未激活狀態),這樣我會有這樣的結果:

code total amount 
A   150 
B   400 
C   80 

我已經嘗試了很多,其中之一是這樣的:

SELECT code, amount1-amount2 
FROM (
    SELECT code, SUM(amount) AS amount1 
    FROM mytable 
    WHERE status='active' 
    GROUP BY code 
    UNION ALL 
    SELECT code, SUM(amount) AS amount2 
    FROM mytable 
    WHERE status='inactive' 
    GROUP BY code 
) as T1 
GROUP BY code 
+0

建立一個[小提琴](HTTP:/ /www.sqlfiddle.com)並與其一起玩 – hd1

+0

將樣本數據與期望的輸出一起包括在內是好的,但如果期望的輸出實際上是從樣本數據中導出的,則會更好。 (在這種情況下,它不可能是因爲集合中沒有'無效'行)。 – jpw

+0

您的描述與所提供的示例不符。看起來你實際上減去了一些*活躍*金額。請澄清你的問題。 –

回答

1

最簡單的解決辦法是使用SUM函數中箱式:

SELECT 
    code, 
    sum(case when status='active' then amount else amount * -1 end) as total_amount 
FROM mytable 
GROUP BY code 

如果可以有其他的狀態,除了有效/無效,你必須更明確:

sum(
    case 
     when status = 'active' then amount 
     when status = 'inactive' then amount * -1 
    end 
) AS total 
+0

這是缺少最後的'GROUP BY代碼' – leonbloy

+0

@leonbloy感謝您的注意,它沒有在複製/粘貼:p – jpw

0
WITH A AS 
(SELECT 
    code, 
    CASE WHEN status='active' THEN amount ELSE -amount END AS signed_amount 
FROM myTable) 

SELECT code, sum(signed_amount) FROM A GROUP BY code; 
+0

請注意,您將得到預期的結果,如果您設置第二個'A',第一個'C'變爲'不活躍'。否則,全部得到總結。 –

相關問題