2015-11-04 88 views
0

我試圖讓這個查詢總結客戶收費不包括稅。在這種情況下,客戶費用和稅金稱爲i.cht_itemcode(VARCHAR(5)),它位於Invoicedetail表中。 原來我使用LEFT JOIN在Invoicedetail表,這是不對的帶來。 Orderheader表的值o.ord_charge與ivd_charge的值相同,其中cht_itemcode是LHF。case語句來排除特定值SUM

我結束了書面方式那段這種方式來代替,並移除左連接。而不是試圖在查詢本身做SUM,我決定拆分2種不同的收費金額,並在SSRS中進行SUM。

CASE WHEN o.ord_invoicestatus='AVL' 
    THEN o.ord_charge 
ELSE (select sum(i.ivd_charge) from invoicedetail i 
     where i.cht_itemcode='LHF' and i.ord_hdrnumber=o.ord_hdrnumber) 
END as 'Revenue', 
(SELECT SUM(I.IVD_CHARGE) from invoicedetail i where 
i.ord_hdrnumber=o.ord_hdrnumber and i.cht_itemcode not in ('LHF','HST2','TAX3','GST','BCCT'))'Accessorial' 
+0

你可以把'CASE'在'SUM',但不知道這是什麼你問..'SUM(CASE WHEN cht_itemcode IN( 'HST2', 'TAX3', 'BCCT')THEN 0 ELSE i.IVD_CHARGE END)' – JamieD77

回答

0

我會親自更改連接到發票明細的子查詢加入,而不是

FROM Orderheader o 
left join (SELECT i.ord_hdrnumber, 
        SUM(i.IVD_CHARGE) IVD_CHARGE 
      FROM invoicedetail i 
      WHERE i.cht_itemcode<>'DEL' 
        and cht_itemcode NOT IN ('HST2','TAX3','BCCT') 
      GROUP BY i.ord_hdrnumber 
     ) i ON o.ord_hdrnumber=i.ord_hdrnumber 

那麼就改變你的case語句來

(CASE WHEN o.ord_invoicestatus='AVL' 
    THEN o.ord_totalcharge ELSE i.IVD_CHARGE END) AS 'Revenue' 

不要忘記從組中​​刪除i.cht_itemcode通過

0

我是不是能夠按照你所有的問題,但我認爲您的Case/Sum聲明符合您的要求;我是條件SUM語句的忠實粉絲。不過,我寧願稍微改變一下。

你需要編寫查詢以便所有的聯接爲您的所有數據在實際選擇字段被執行,然後在其中執行的總和:

SUM(Case 
    When code_table.code_desc = 'Tax Code' 
    Then Null Else value_table.dollar_value END) 

不同的是,總和是在行的開始,而不是嵌入案件。這是什麼讓你做的是使用GROUP BY在查詢結束對付你想組合成一個張開的記錄。也許這可以幫助你處理你回來的多條記錄?

+0

我認爲這種方法確實有效;我完全刪除了左連接,並決定將值分成2列。它現在看起來像這樣:CASE WHEN o.ord_invoicestatus ='AVL'then o.ord_charge ELSE(從invoicedetail i中選擇sum(i.ivd_charge),其中i.cht_itemcode ='LHF'和i.ord_hdrnumber = o.ord_hdrnumber)END as '收入', (SELECT SUM(I.IVD_CHARGE)from invoicedetail i where i.ord_hdrnumber = o.ord_hdrnumber and i.cht_itemcode not in('LHF','HST2','TAX3','GST','BCCT' )''Accessorial' – samalkobi

+0

很高興聽到你在正確的軌道上。我只是提醒你警惕「窗口」的陳述。通過在一個字段中嵌入一個完整的select語句,會大大增加查詢的開銷,並且有時這可能會降低引擎中內置的查詢優化器的性能。如果您在有限的開發數據庫上開發此查詢,或者如果您希望將此部署的數據庫部署到快速增長,請確保使用數據方面最糟糕的可想象的方案進行測試。 – Mikuana

0

我結束了除去LEFT JOIN共和具有2個獨立的列,1爲客戶充電和1 accessorials所以現在我可以在SSRS一起添加它們。

CASE WHEN o.ord_invoicestatus='AVL' then o.ord_charge ELSE 
    (select sum(i.ivd_charge) from invoicedetail i where 
     i.cht_itemcode='LHF' and i.ord_hdrnumber=o.ord_hdrnumber) END as 'Revenue', 
(SELECT SUM(I.IVD_CHARGE) from invoicedetail i where 
i.ord_hdrnumber=o.ord_hdrnumber and i.cht_itemcode not in ('LHF','HST2','TAX3','GST','BCCT'))'Accessorial'