是否可以汇总不同的where子句?

Ben*_*ter 1 sql t-sql sql-server

是否可以根据where子句的不同来计算多个聚合?例如:

假设我有两个表,一个用于Invoice,另一个用于InvoiceLineItems.发票表具有发票总额的总字段,InvoiceLineItems表中的每个发票行项记录都包含一个字段,表示该行项目是否可折扣.我想要三个总和,一个是Discountable = 0,一个是Discountable = 1,另一个是Discountable无关紧要.这样我的输出将是:

InvoiceNumber  Total  DiscountableTotal  NonDiscountableTotal
-------------  -----  -----------------  --------------------
1              53.27  27.27              16.00
2              38.94   4.76              34.18
3...
Run Code Online (Sandbox Code Playgroud)

到目前为止我找到的唯一方法是使用类似的东西:

Select i.InvoiceNumber,
       i.Total,
       t0.Total As DiscountableTotal,
       t1.Total As NonDiscountableTotal
From   Invoices i
    Left Join (
        Select   InvoiceNumber,
                 Sum(Amount),
        From     InvoiceLineItems
        Where    Discountable = 0
        Group By InvoiceNumber
    ) As t0 On i.InvoiceNumber = t0.InvoiceNumber
    Left Join (
        Select   InvoiceNumber,
                 Sum(Amount)
        From     InvoiceLineItems
        Where    Discountable = 1
        Group By InvoiceNumber
    ) As t1 On i.InvoiceNumber = t1.InvoiceNumber
Run Code Online (Sandbox Code Playgroud)

这看起来有点麻烦,如果我可以这样做会很好:

Select   InvoiceNumber,
         Sum(Amount) Where Discountable = 1 As Discountable
         Sum(Amount) Where Discountable = 0 As NonDiscountable
Group By InvoiceNumber
Run Code Online (Sandbox Code Playgroud)

我意识到SQL完全无效,但它在逻辑上描绘了我正在尝试做的事情......

TIA

PS我需要这个在SQL Server 2000实例上运行,但我也感兴趣(以供将来参考)如果/如何在SQL Server 2005/2008上实现这一点.

OMG*_*ies 7

使用:

  SELECT i.invoicenumber,
         SUM(CASE WHEN i.discountable = 1 THEN i.amount ELSE 0 END) AS discountable,
         SUM(CASE WHEN i.discountable = 0 THEN i.amount ELSE 0 END) AS NonDiscountable
    FROM INVOICES i
GROUP BY i.invoicenumber
Run Code Online (Sandbox Code Playgroud)

要获取INVOICES表中的任何其他列(IE:total),您必须进行自联接:

SELECT x.invoicenumber,
       x.total,
       y.discountable,
       y.nondiscountable
  FROM INVOICES x
  JOIN (SELECT i.invoicenumber,
               SUM(CASE WHEN i.discountable = 1 THEN i.amount ELSE 0 END) AS discountable,
               SUM(CASE WHEN i.discountable = 0 THEN i.amount ELSE 0 END) AS NonDiscountable
          FROM INVOICES i
      GROUP BY i.invoicenumber) y ON y.invoicenumber = x.invoicenumber
Run Code Online (Sandbox Code Playgroud)