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上实现这一点.
使用:
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)
归档时间: |
|
查看次数: |
145 次 |
最近记录: |