Sql server 2008 CASE语句以排除SUM中的特定值

Sql server 2008 CASE语句以排除SUM中的特定值,sql-server-2008,tsql,Sql Server 2008,Tsql,我试图让这个查询在不含税的情况下计算客户费用的总和。在这种情况下,客户费用和税费称为i.cht_itemcodeVARCHAR5,位于Invoicedetail表中。 最初我使用左连接引入Invoicedetail表,这是错误的。Orderheader表中的值o.ord_charge与ivd_charge相同,其中cht_itemcode为LHF 我最终以这种方式写了那个部分,并删除了左连接。我没有尝试在查询中求和,而是决定将两个不同的费用金额分开,在SSR中求和 CASE WHEN o.ord

我试图让这个查询在不含税的情况下计算客户费用的总和。在这种情况下,客户费用和税费称为i.cht_itemcodeVARCHAR5,位于Invoicedetail表中。 最初我使用左连接引入Invoicedetail表,这是错误的。Orderheader表中的值o.ord_charge与ivd_charge相同,其中cht_itemcode为LHF

我最终以这种方式写了那个部分,并删除了左连接。我没有尝试在查询中求和,而是决定将两个不同的费用金额分开,在SSR中求和

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'

我个人会将发票明细的连接改为子查询连接

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

别忘了通过

从您的组中删除i.cht\u itemcode。我无法完全理解您的问题,但我认为您的案例/总结陈述是正确的;我非常喜欢条件和语句。然而,我更喜欢做稍微不同

您需要编写查询,以便对所有数据执行所有联接,然后在执行求和的实际select字段中:

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

不同之处在于,总和位于行的开头,而不是嵌入到案例中。这允许您在查询结束时使用GROUP BY来处理要合并为一个的八字记录。也许这有助于您处理返回的多个记录?

我最终删除了左连接,并有两个单独的列,一个是客户费用,一个是附加费,因此现在我可以将它们添加到SSR中

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'

你可以把一个箱子放在你的总数里,但不能确定那是你要的。。SUMCASE当cht_项目代码为'HST2'、'TAX3'、'BCCT'时,则为0其他i.IVD_费用End,我认为此方法实际有效;我完全删除了左连接,并决定将值拆分为两列。现在看起来是这样的:如果o.ord\u invoicestatus='AVL'然后o.ord\u charge ELSE从invoicedetail i中选择sumi.ivd\u charge,其中i.cht\u itemcode='LHF'和i.ord\u hdrnumber=o.ord\u hdrnumber=o.ord\u hdrnumber结尾为'Revenue',HST2',TAX3',GST',从invoicedetail i中选择sumi.ivd\u charge,“BCCTAccessorial”很高兴听到你走上了正确的道路。我只是提醒你要提防那些有窗口的陈述。通过在字段中嵌入一个完整的select语句,可以显著增加查询的开销,有时这实际上会降低引擎中内置的查询优化器的性能。如果您在有限的开发数据库上开发此查询,或者如果您希望部署此查询的数据库快速增长,请确保使用数据方面可以想象的最坏情况对其进行测试。
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'