如何编写SQL校验两表同Outlet的金额总和是否匹配?
问题分析与正确SQL实现
原代码的问题
- 用逗号连接表会产生笛卡尔积,导致计算的总和完全错误
- CASE表达式中不能嵌套WHERE子句,WHERE用于过滤行,不能放在WHEN条件内
- SELECT语句里不能用
PRINT输出字符串,直接返回目标字符串即可 - 缺少
GROUP BY,无法按单个Outlet单独计算金额总和
正确实现逻辑
先分别计算两个表中每个Outlet的金额总和,再通过全连接关联两个结果集,最后用CASE判断每个Outlet的总和是否匹配:
WITH A_Summary AS ( SELECT Outlet, SUM(Amount) AS Total_Amount FROM TableA GROUP BY Outlet ), B_Summary AS ( SELECT Outlet, SUM(Amount) AS Total_Amount FROM TableB GROUP BY Outlet ) SELECT COALESCE(a.Outlet, b.Outlet) AS Outlet, CASE WHEN a.Total_Amount = b.Total_Amount THEN 'Match' ELSE 'Not Match' END AS Match_Result FROM A_Summary a FULL JOIN B_Summary b ON a.Outlet = b.Outlet;
代码说明
- CTE(公共表表达式):分别统计TableA和TableB中每个Outlet的总金额,生成两个汇总结果表
- FULL JOIN:确保不管是TableA有但TableB没有的Outlet,还是TableB有但TableA没有的Outlet,都能被纳入结果
- COALESCE:处理某一方不存在对应Outlet的情况,显示存在的那一方的Outlet名称
- CASE表达式:直接对比两个汇总表的总金额,输出对应的匹配状态
执行结果
基于你提供的数据,执行后会得到:
| Outlet | Match_Result |
|---|---|
| A | Not Match |
| B | Not Match |
| C | Not Match |
内容的提问来源于stack exchange,提问作者Enzo Austin
相关产品推荐
相关产品推荐

