2011-08-09 66 views
3

我有一個查詢嘗試編制費用和信用報告,並按項目代碼和結算週期進行分組。它從拉計費表的格式如下:根據值從結果集中選擇特定記錄

BillingPeriod|ItemCode|ItemName|Charge|IsAdjustment|AdjustmentDate|ReportTimestamp 

我遇到了我現在的查詢處理很漂亮了一些問題,我想。由於有些時候計費代碼沒有出現在收費表中,因爲我們沒有爲此收費,但是我想要一個顯示每個計費週期的統一表格,所以我製作了一個填充了計費週期和零的虛擬表格,和聯盟與從收費表中的結果,這樣的:

SELECT BillingPeriod, SumOfCharge AS Total FROM (
     SELECT BillingPeriod, 0 AS SumOfCharge 
     FROM Charges 
     UNION 
     SELECT BillingPeriod, SUM(Charge) AS SumOfCharge 
     FROM Charges 
     WHERE (ItemCode Between 1900 and 1995) 
     GROUP BY BillingPeriod 
); 

那麼最終發生的事情是這樣的:說,例如,我對2011年1三月,但沒有別的充一次電。該表將返回輸出是這樣的:

BillingPeriod|Charge 
1/1/2011  |100.00 
1/1/2011  |0 
2/1/2011  |0 
3/1/2011  |0 
3/1/2011  |-23.00 
4/1/2011  |0 
5/1/2011  |0 
6/1/2011  |0 
7/1/2011  |0 

我想要做的就是擺脫那些0值的行,並選擇正確的一個報告中顯示。唯一棘手的部分是值可能是積極的,消極的或零,所以只是做MAX是行不通的。我也嘗試過FIRST()或LAST(),(COALESCE())不起作用,我正在訪問)。任何幫助,將不勝感激。

回答

4

只是總結SumOfCharge字段和組由BillingPeriod

SELECT BillingPeriod, SUM(SumOfCharge) AS Total FROM (
    SELECT BillingPeriod, 0 AS SumOfCharge 
    FROM Charges 
    UNION 
    SELECT BillingPeriod, SUM(Charge) AS SumOfCharge 
    FROM Charges 
    WHERE (ItemCode Between 1900 and 1995) 
    GROUP BY BillingPeriod 
) GROUP BY BillingPeriod; 
+0

哇,我簡直不敢相信我沒想到那個謝謝你! – Tom

1

如何:

SELECT P.BillingPeriod, 
ISNULL(C.SumOfCharge,0) AS SumOfCharge 
FROM (
    SELECT Distinct BillingPeriod 
    FROM Charges) AS P 
LEFT JOIN 
    (SELECT BillingPeriod, SUM(Charge) AS SumOfCharge 
    FROM Charges 
    WHERE (ItemCode Between 1900 and 1995) 
    GROUP BY BillingPeriod) as C 
ON P.BillingPeriod = C.BillingPeriod 
ORDER BY P.BillingPeriod 
0

會是這樣的工作:

SELECT C.BillingPeriod, 
     ISNULL(C1.SumOfCharge, 0) AS Total 
FROM Charges 
LEFT OUTER JOIN (SELECT BillingPeriod, SUM(Charge) AS SumOfCharge 
       FROM Charges 
       WHERE (ItemCode Between 1900 and 1995) 
       GROUP BY BillingPeriod) C1 ON C.BillingPeriod = C1.BillingPeriod 
相關問題