基于Group By与SUM函数计算供应商实际付款总额并找出最高支出供应商
解决方法:正确计算供应商支出并找出最高支出者
核心思路
通过CASE表达式根据InvoiceType动态调整金额正负(Credit类型记为负数),仅统计CurrentStatus = 'Paid'的记录,按供应商分组求和后,排序取总额最高的记录。
正确的SQL查询
SELECT TOP 1 SupplierID, SUM(CASE WHEN InvoiceType = 'Credit' THEN -InvoiceTotal ELSE InvoiceTotal END) AS TotalSpent FROM Supplier_Invoices WHERE CurrentStatus = 'Paid' GROUP BY SupplierID ORDER BY TotalSpent DESC
你的第二个查询返回NULL的原因
当某个供应商没有Debit或Credit类型的发票时,对应的子查询SUM()会返回NULL,而NULL参与算术运算(比如数值 - NULL)的结果仍为NULL,最终导致所有TotalAmt显示为NULL。
更优实现说明
上面的查询仅需一次表扫描即可完成所有逻辑,比嵌套子查询更高效:
- 一步过滤出
Paid状态的记录 - 用
CASE实时调整金额正负,避免多次重复扫描表 - 分组后直接排序取TOP1,逻辑清晰且性能更优
示例数据验证
代入你提供的测试数据,计算结果如下:
- SUP-1: 1200 - 600 = 600.00
- SUP-2: 400 + 300 = 700.00
- SUP-3: -20000.00
- SUP-4: 未统计(状态为Unpaid)
最终返回SUP-2,完全符合预期结果。
内容的提问来源于stack exchange,提问作者Jessa M
相关产品推荐
相关产品推荐

