2011-04-06 56 views
4

我有2个表,我需要查询并返回结果集的“例外”的基础上,如果table1中的字段的总和等于table2中的字段的总和(其中其他栏匹配)。SQL左加入加法列的加倍值

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返回的行数相乘。

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

我敢肯定我缺少一些基本的东西,在左连接中使用聚合函数(总和)。

感谢您的帮助!

(系统是MSSQL)

回答

6

试试这个query..Basically,你应该seperately机组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来定义行。如果有更多的行,您可能需要添加他们。

+0

+1用于在执行连接之前分别汇总结果。 – 2011-04-06 22:04:58

+0

谢谢Rajesh。这就是我最终使用的! – nth 2011-04-07 18:24:42

0

它完全按照您要求的方式进行(但这与您预期的不同)。表1中的每一行在结果集中至少会重复一次。如果它匹配表2中的多于一行,那么它将显示多次。

在看着你原来的SQL,它会出现,你要完成的任务是:

select * 
from  (select TranName , 
        TranDate , 
        TranCode , 
        TranQTy = sum(TranQty) 
      from Table1 
      group by TranName , 
        TranDate , 
        TranCode 
     ) A 
full join (select TranName , 
        TranDate , 
        TranCode , 
        TranQTy = sum(TranQty) 
      from Table2 
      group by TranName , 
        TranDate , 
        TranCode 
     ) B 
where ( A.TranQty is  null and B.TranQty is not null 
     OR A.TranQty is not null and B.TranQty is  null 
     OR A.TranQt != B.TranQty 
    ) 

你想找到两组分别汇总之间的差别。