CASE语句用于排除SUM中的特定值

时间:2015-11-04 22:01:34

标签: sql-server-2008 tsql

我试图通过此查询来计算客户费用而不包括税金。在这种情况下,客户费用和税收被称为i.cht_itemcode(VARCHAR(5)),它位于Invoicedetail表上。 最初我使用LEFT JOIN来引入Invoicedetail表,这是错误的。 Orderheader表中的值o.ord_charge与ivd_charge相同,其中cht_itemcode是LHF。

我最终以这种方式编写了这部分,并删除了左连接。我没有尝试在查询本身中执行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'

3 个答案:

答案 0 :(得分: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 WHEN o.ord_invoicestatus='AVL'
     THEN o.ord_totalcharge ELSE i.IVD_CHARGE END) AS 'Revenue'

不要忘记通过

从您的论坛中移除i.cht_itemcode

答案 1 :(得分:0)

我无法解决您的所有问题,但我认为您的Case / Sum声明已经走上了正确的轨道;我是条件SUM语句的忠实粉丝。但是我更喜欢略有不同。

您需要编写查询,以便为所有数据执行所有连接,然后在执行总和的实际选择字段中执行:

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

不同之处在于总和位于行的开头而不是嵌入到案例中。这允许您执行的操作是在查询结束时使用GROUP BY来处理要合并为一个的展开记录。也许这可以帮助您处理您要回复的多条记录?

答案 2 :(得分:0)

我最终完全删除了LEFT JOIN,并且有2个单独的列,1个用于客户费用,1个用于辅助,所以现在我可以将它们一起添加到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'