2015-11-04 72 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'