2009-10-22 125 views
1

我無法讓我的用戶定義的函數正常運行。我在SQL Server 2000上運行。SQL用戶定義函數問題

我試圖返回一個表中的所有用戶在「BillingTransactions」表中有一個平衡。我們的交易由RecordType字段指定; 0購買,1付款。所以我想要做的是獲得所有用戶的列表,其中RecordType 0的每個事務的總和等於每個事務與RecordType 1的總和。這就是我的函數的內部部分現在的樣子:

SELECT DISTINCT UserName FROM BillingTransactions 
WHERE (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 0 
    AND 
    [BillingTransactions].[UserName]= UserName) 
    = 
    (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 1 
    AND 
    [BillingTransactions].[UserName]= UserName) 

我有一種感覺,這不是最有效的方式來做到這一點...有沒有其他方式可以看到如何去做這件事?謝謝!

+0

爲什麼不將此存儲過程? – 2009-10-22 22:09:11

回答

11

與任何SQL查詢,效率會被你的數據的實際佈局(表結構,索引結構)一樣多的文本來驅動查詢。以下是表達相同請求的相同查詢的一個版本,但逐字逐句並可能更有效:

SELECT UserName 
FROM BillingTransactions 
GROUP BY UserName 
HAVING 0 = SUM(
    CASE RecordType 
    WHEN 1 THEN AMOUNT 
    WHEN 0 THEN -AMOUNT 
    ELSE 0 
    END); 
+0

這真的很酷。 – Manu 2009-10-22 22:10:27

+0

非常酷,謝謝! – Kevin 2009-10-22 22:13:26

+0

非常優雅的解決方案。 – 2009-10-22 22:13:57

3

嘗試這樣代替:

select a.username 
from (select username, sum(amount) totalAmount 
    from BillingTransactions 
    where RecordType = 0 
    group by username 
    ) a 
join (select username, sum(amount) totalAmount 
    from BillingTransactions 
    where RecordType = 1 
    group by username 
    ) b on b.username = a.username and b.totalAmount = a.totalAmount