SQL Left Join加倍汇总列的值

标签 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)

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

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

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

谢谢您的帮助!

(系统为MSSql)

最佳答案

试试这个查询..基本上,你应该分别聚合 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

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

关于SQL Left Join加倍汇总列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573424/

相关文章:

MYSQL 内部联接返回重复结果(已使用 DISTINCT)

mysql - 具有 LEFT JOIN 和常规 JOIN 的未知列

sql - 在 codeigniter 中不显示任何查询

sql - 想要使用 group by 分组显示数据

结果可以在不同列中的最后 x 个结果的 MySQL sum avg

数据库;求和 2 个字段,然后将它们相加

mysql - 对整个左外连接集执行过滤

php - 从多个表中加速 SELECT

MYSQL AND OR 在多对多表上

c# - Linq 按日期分组(月)