2011-07-27 32 views
4

對於每個用戶,我想要產生一個聚合結果。但是,我一直遇到返回多於1個結果的子查詢問題。tqsl - select查詢的結果在子查詢中作爲變量操作?

SELECT **[user]**, 
    ((SELECT SUM(amount) 
      FROM transactions 
      WHERE [user] = **[user]** 
      AND [type] = 'credit') - 
      (SELECT SUM(amount) 
      FROM transactions 
      WHERE [user] = **[user]** 
      AND [type] = 'debit')) 
    FROM transactions 

我如何從selectuser在開局就那麼作爲子查詢變量user操作?

+0

謝謝@sll清理代碼的演示:) – Paul

回答

3

使用CASE簡化求和:

SELECT user,SUM(CASE type WHEN 'credit' THEN amount WHEN 'debit' THEN -amount END) 
from transactions 
GROUP BY user 

如果信用卡和借記卡是唯一有效的類型,那麼就可以進一步簡化爲:

CASE type WHEN 'credit' THEN amount ELSE -amount END 

使用子查詢進行求和活動的答案,同時還從交易表將執行選擇用戶總計多次 - 對於交易表中的每一行一次 - 因此如果一個用戶有5個交易,他們將計算總和5次(並顯示5個結果行),我認爲你不想要。

+0

謝謝@Damien_The_Unbeliever!之前我的PHP和TSQL解決方案已經完成了30秒的工作,但現在它已經大幅縮減到1秒以內!非常感謝! – Paul

0

也許

SELECT t.user, 
((SELECT SUM(amount) FROM transactions WHERE [user] = t.user AND [type] = 'credit') - 
(SELECT SUM(amount) FROM transactions WHERE [user] = t.user AND [type] = 'debit')) 
FROM transactions t 
+0

不幸@Marc這個選項沒有用。它沒有爲每個用戶提供單一的聚合結果。感謝:) – Paul

1

試試這個:

SELECT user, 
    (SELECT SUM(amount) 
    FROM transactions 
    WHERE [user] = t.User 
     AND [type] = 'credit') 
    - 
    (SELECT SUM(amount) 
    FROM transactions 
    WHERE [user] = t.User 
     AND [type] = 'debit')) 
FROM transactions t 

或本:

SELECT user, 
    Sum (Case type When 'credit' then Amount End) credit, 
    Sum (Case type When 'debit' then Amount End) debit, 
    Sum (Case type When 'credit' then Amount 
        When 'debit' then -Amount End) NetAmount  
FROM transactions t 
Group By User 
+0

謝謝你的想法,但我選擇稍微簡潔的選項:) – Paul

2
select username, 
     SUM(amount * case when operation = 'credit' then 1 else -1 end) as balance 
from #transaction 
group by username 
+0

爲建議歡呼! – Paul

0

@Rubens Farias的解決方案的變化:

SELECT 
    t.[user], 
    SUM(t.amount * x.factor) 
FROM transactions t 
    INNER JOIN (
    SELECT 'credit', 1 UNION ALL 
    SELECT 'debit', -1 
) x (type, factor) ON t.type = x.type 
GROUP BY t.[user] 
+0

您需要在您的子選擇中的列上的名稱 –

+0

@ t-clausen.dk:列的別名在子查詢的別名後面的括號中指定:'x(type,factor)'。 –

1

我喜歡@Rubens答案,但...

你的數據結構,可以使用一些工作。

實際上爲每筆交易存儲單詞'credit'或'debit',更不用說爲了將其轉換爲可用值(1或-1)而使用case語句評估它是昂貴的。

如果您的交易表跟蹤數量,那麼您可以使用它來代替存儲和評估'信用'和'借方'。正數量(例如,我買了2把耙子等);和Netagive數量(例如-1 rake,這意味着您返回或獲得了其中一個耙子的功勞)可以進行求和,而無需執行任何案例陳述評估。

相關問題