SQL Left加入求和列的加倍值

nth*_*nth 4 sql sum left-join

我有2个表需要查询并返回"异常"的结果集,基于table1中的字段总和是否等于table2中字段的总和(其他列匹配).

select A.TranName,A.TranDate,A.TranCode,SUM(A.TranQty) AS T1Qty,B.TranName,B.TranDate,B.TranCode,SUM(B.TranQty) AS T2Qty
from Table1 AS A
LEFT JOIN Table2 AS B
on A.TranName = B.TranName AND A.TranDate = B.TranDate AND A.TranCode = B.TranCode
GROUP BY A.TranName, A.TranDate, A.TranCode, B.TranName, B.TranDate, B.TranCode
HAVING SUM(A.TranQty) != SUM(B.TranQty)
Run Code Online (Sandbox Code Playgroud)

结果集不正确,因为它将Table1.TranQty总和乘以Table2返回的行数.

例如,如果Table1有1条记录,其中连接匹配Table2中的2条记录,则Table1中1条记录的TranQty将乘以2(因此不正确匹配).

我确定我遗漏了一些关于在左连接中使用聚合函数(sum)的基本知识.

谢谢您的帮助!

(系统是MSSql)

Raj*_*thi 6

尝试此查询.基本上,您应该单独聚合A和B的结果,然后验证计数.

select a.TranName,a.TranDate,a.TranCode
from (
select TranName,TranDate,TranCode, SUM(TranQty) AS T1Qty
Table1 
group by TranName,TranDate,TranCode) a
LEFT JOIN
(
select TranName,TranDate,TranCode, SUM(TranQty) AS T1Qty
Table2 
group by TranName,TranDate,TranCode) b
on (A.TranName = B.TranName AND A.TranDate = B.TranDate AND 
    A.TranCode = B.TranCode)
where a.T1Qty != b.T1Qty
Run Code Online (Sandbox Code Playgroud)

确保这三列的组合足以在A和B中定义一行.如果有其他行,您可能还需要添加它们.