2013-07-30 25 views
0

這可能比我想象的更容易,但我很難過。我編寫了以下查詢,其中總結了某個特定商店的客戶所進行的所有采購以及同一個商店中同一客戶的總回報量,最後存儲了從總數中減去總回報的結果在名爲TOTAL_SPENT的計算列中進行購買。這裏是我的查詢:如何過濾SQL中的數學計算數據?

SELECT Account_Id, 
    SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, 
    SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED, 
    (TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT 
FROM Transactions_Table 
WHERE Store = 'Store XYZ' 
GROUP BY Account_Id 
ORDER BY TOTAL_SPENT DESC 

我的問題是,這個查詢返回成千上萬的記錄,但我只關心所返回的數據的約10%左右。因此,假設您只想查看返回TOTAL_SPENT> = 500.00的數據。但是對於我的生活,我無法弄清楚如何做到這一點! 在恥

回答

1

在SQL掛頭,所述WHERE子句的SELECT子句之前處理。因此,當SQL開始過濾表中與您的查詢相關的行時,關於列TOTAL_SPENT還不知道

有幾種方法可以解決這個問題。

1)重複你WHERE條款表達,而不是指的是列名在SELECT條款:

SELECT Account_Id, 
    SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, 
    SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED, 
    (TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT 
FROM Transactions_Table 
WHERE Store = 'Store XYZ' 
GROUP BY Account_Id 
ORDER BY 
    (SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) - SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END)) DESC 

注:如果你正在尋找找到與一個TOTAL_SPENT 500以上,使用HAVING子句,而不是WHERE

2)使用視圖。刪除您的WHERE子句並創建一個VIEW與您的查詢。然後,從查看中選擇並添加您的WHERE子句。

CREATE VIEW Whatever AS 
    SELECT Account_Id, 
     SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, 
     SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED, 
     (TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT 
    FROM Transactions_Table 
    GROUP BY Account_Id; 

SELECT * From Whatever WHERE TOTAL_SPENT >= 500 

3)使用嵌套查詢:

select * from (
    SELECT 
    Account_Id, 
    SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, 
    SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED, 
    (TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT 
    FROM Transactions_Table 
    WHERE Store = 'Store XYZ' 
    GROUP BY Account_Id 
) where TOTAL_SPENT > 500 ORDER BY TOTAL_SPENT DESC; 

4)如果你的數據庫支持它,使用一個CTE:

WITH MyQuery AS (
    SELECT 
    Account_Id, 
    SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, 
    SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED, 
    (TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT 
    FROM Transactions_Table 
    WHERE Store = 'Store XYZ' 
    GROUP BY Account_Id 
) 
SELECT * FROM MyQuery WHERE TOTAL_SPENT > 500 ORDER BY TOTAL_SPENT DESC; 
+0

謝謝你,先生!正如你所建議的,我試圖創建一個視圖,但不幸的是,我沒有給出足夠高的訪問級別來創建視圖。我嘗試了下一步的嵌套選擇,它給了我正在尋找的確切結果。 –