2011-04-06 57 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 
    ) 

你想找到兩組分別彙總之間的差別。