2010-12-22 48 views
1

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

比方说,我有两个表,一个用于发票,一个用于InvoiceLineItems。发票表中有一个发票总计字段,并且InvoiceLineItems表中的每个发票行项目记录都包含一个字段,该字段表示该行项目是否可以折扣。我需要三个总和,其中一个折扣= 0,一个折扣= 1,折扣无关。这样,我的输出将是:

InvoiceNumber Total DiscountableTotal NonDiscountableTotal 
------------- ----- ----------------- -------------------- 
1    53.27 27.27    16.00 
2    38.94 4.76    34.18 
3... 

我到目前为止发现的唯一方法是使用类似:

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 

这似乎有些繁琐,这将是很好,如果我能做些什么像:

Select InvoiceNumber, 
     Sum(Amount) Where Discountable = 1 As Discountable 
     Sum(Amount) Where Discountable = 0 As NonDiscountable 
Group By InvoiceNumber 

我知道SQL是完全无效的,但它在逻辑上描绘什么,我试图做...

TIA

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

回答

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 

要获得发票表中的任何其他列(IE:总),你必须做一个自我联接:

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 
+1

我不知道为什么我从来没有想到这一点...似乎很明显,现在它在我面前。谢谢。 – BenAlabaster 2010-12-22 18:54:19

+0

+1代表第一个代码段。不直观,但它工作得很好。 – 2010-12-22 20:47:07

-1

不能确定实际语法,但这样的事情应该工作:

Select InvoiceNumber, 
     Sum(IF(Discountable=1;Amount;0)) As IsDiscountable 
     Sum(IF(Discountable=0;Amount;0)) As NonDiscountable 
From Invoice 
Group By InvoiceNumber