2014-11-13 63 views
1

SQL Server 2008 R2的SQL - 一對多與左外連接加入

我有2個表

表1

Col1 Col2 Col3 Col4 
123 08 1 1 
123 08 1 1 
123 08 2 1 

表2

Col1 Col2 Col3 
123 08 6 

表1是m因此大多數數據來自此表,並且它必須是Table2上的LEFT OUTER JOIN,因爲Table1具有值(col1,col2),它們並不總是在TABLE2中返回值,並應顯示爲NULLS。

我的查詢是

SELECT 
    a.Col2, 
    SUM(a.Col3), 
    SUM(a.Col4), 
    SUM(b.Col3) 
FROM 
    Table 1 a 
    LEFT OUTER JOIN Table2 b 
    ON a.col1 = b.col1 AND a.col2 = b.col2 
GROUP BY a.Col2 

這將返回08,4,3,18

我希望這回08,4,3,6

因爲表2加入上3行,然後三倍的SUM值爲b.Col3

什麼是最好的解決方案?

回答

1

如果你不想在整個記錄,總結,你可以添加b.Col3到GROUP BY:

SELECT 
    a.Col2, 
    SUM(a.Col3), 
    SUM(a.Col4), 
    b.Col3 
FROM 
    Table 1 a 
    LEFT OUTER JOIN Table2 b 
    ON a.col1 = b.col1 AND a.col2 = b.col2 
GROUP BY a.Col2, b.Col3 
+0

這個效果很好,因爲我創建了一個視圖並總結了Table2的內容,然後加入到新視圖中,並與Col3一起使用該組,感謝您的幫助 – DtotheG

0

請試試這個。如果對於同一個col1和col2,您在table2中有兩條記錄,這也會很謹慎。

SELECT 
a.Col2, 
SUM(a.Col3), 
SUM(a.Col4), 
MAX(b.Col3) FROM 
Table 1 a 
LEFT OUTER JOIN (select col1, col2, sum(col3) as col3 from Table2 group by col1, col2) b ON a.col1 = b.col1 AND a.col2 = b.col2 
GROUP BY 
a.Col2 
0

如果在第四欄想要的結果不是總和,那麼它的不清楚你想要什麼。如果您可以依靠每個組的所有行在該列中具有相同的值(它們將在您的示例中,但可能不會與不同的數據),並且如果您想要的值,則可以使用此值:

SELECT 
    a.Col2, 
    SUM(a.Col3), 
    SUM(a.Col4), 
    MIN(b.Col3) 
FROM 
    Table 1 a 
    LEFT OUTER JOIN Table2 b 
    ON a.col1 = b.col1 AND a.col2 = b.col2 
GROUP BY a.Col2 

你也可以使用MAX()代替MIN(),當然。