SQL SUM Group By with Case 语句

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

我希望结果 return 为:

数量|状态

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

将订单 table 添加到您的联接中,然后使用聚合函数:

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