[英]SQL SUM Group By with Case statement
我想按状态分组并汇总总质押金额,但如果质押状态等于取消,则汇总已支付的总金额。 我不确定这样做的最佳方法是什么?
感谢您的反馈和帮助!
SELECT
dbo.FoundationCompanies.companyState,
CASE WHEN dbo.FondationOrder.pledgeStatus = 'canceled' THEN
(
SELECT SUM(paid) AS total
FROM dbo.FoundationInvoice
WHERE (orderId = dbo.FondationOrder.orderId)
)
ELSE
dbo.FondationOrder.pledgeAmount
END AS pledgeAmount
FROM
dbo.FoundationCompanies
INNER JOIN
dbo.FondationOrder
ON
dbo.FoundationCompanies.compId = dbo.FondationOrder.compId
GROUP BY dbo.FoundationCompanies.companyState
ORDER BY dbo.FoundationCompanies.companyState
示例数据:
阿冈昆 2500.00
亚特兰大 500000.00
贝茨维尔 10000.00
贝茨维尔 25000.00
我希望结果返回为:
金额|状态
100,000.00 美元|AL
145,000.00 美元|AZ
问:我不确定这样做的最佳方法是什么?
A : 不,它会使用多慢查询,你可以使用left join
子查询来避免它,就像下面的脚本:
SELECT
companyState,
CASE WHEN FondationOrder.pledgeStatus = 'canceled' THEN
T.total
ELSE
FondationOrder.pledgeAmount
END AS pledgeAmount
FROM FoundationCompanies
INNER JOIN FoundationContacts ON FoundationCompanies.companyId = FoundationContacts.companyId
INNER JOIN FondationOrder ON FoundationContacts.contactId = FondationOrder.contactId
LEFT JOIN (
SELECT orderId,SUM(paid) AS total
FROM FoundationInvoice
GROUP BY orderId
) T on T.orderId = FondationOrder.orderId
GROUP BY FoundationCompanies.companyState
ORDER BY FoundationCompanies.companyState
将 Order 表添加到您的连接中,然后使用聚合函数:
SELECT
dbo.FoundationCompanies.companyState,
SUM(IIF(dbo.FondationOrder.pledgeStatus = 'canceled', dbo.FoundationInvoice.paid, dbo.FondationOrder.pledgeAmount)) AS pledgeAmount
FROM dbo.FoundationCompanies
INNER JOIN dbo.FoundationContacts ON dbo.FoundationCompanies.companyId = dbo.FoundationContacts.companyId
INNER JOIN dbo.FondationOrder ON dbo.FoundationContacts.contactId = dbo.FondationOrder.contactId
LEFT JOIN dbo.FoundationInvoice ON dbo.FondationOrder.orderId = dbo.FoundationInvoice.orderId
GROUP BY dbo.FoundationCompanies.companyState
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.