2011-02-17 115 views
1

爲什麼這個查詢不能正確執行?2表中的左連接

SELECT pr.ProjectNumber, 
    SUM(ma.TotalAmount) As CostOfMaterials, 
    SUM(ot.TotalAmount) AS CostOfOthers 
FROM [dbo].[tblProject] AS pr 
LEFT JOIN [dbo].[tblCostOfMaterials] AS ma ON pr.ProjectNumber=ma.ProjectNumber 
LEFT JOIN [dbo].[tblCostOfOthers] AS ot ON pr.ProjectNumber=ot.ProjectNumber 
GROUP BY pr.ProjectNumber 
+2

您是否收到錯誤?如果是這樣,錯誤是什麼意思?如果你只是沒有得到你想要的結果,你希望達到什麼目的,這會給你什麼?我們需要更多信息來幫助你。 – anothershrubery 2011-02-17 12:03:58

+1

爲什麼這個問題不正確?沒有某種錯誤信息,很難提供幫助。 – Dai 2011-02-17 12:04:37

回答

1

我假定你的意思是說,因爲每個表有多個行的特定項目編號,你可以多次計算相同的值。爲了避免這種情況,你可以使用

;WITH ma 
    AS (select ProjectNumber, 
       SUM(TotalAmount) as CostOfMaterials 
     FROM [dbo].[tblCostOfMaterials] 
     GROUP BY ProjectNumber), 
    ot 
    AS (select ProjectNumber, 
       SUM(TotalAmount) as CostOfOthers 
     FROM [dbo].[tblCostOfOthers] 
     GROUP BY ProjectNumber) 
SELECT pr.ProjectNumber, 
     CostOfMaterials, 
     CostOfOthers 
FROM [dbo].[tblProject] AS pr 
     LEFT JOIN ma 
     ON pr.ProjectNumber = ma.ProjectNumber 
     LEFT JOIN ot 
     ON pr.ProjectNumber = ot.ProjectNumber 

爲什麼你這種行爲的原因是因爲你越來越小直角連接

WITH tblProject (ProjectNumber) AS 
(
SELECT 1 
),tblCostOfMaterials(ProjectNumber, TotalAmount) AS 
(
SELECT 1,101 UNION ALL 
SELECT 1,201 UNION ALL 
SELECT 1,301 
), 
tblCostOfOthers(ProjectNumber, TotalAmount) AS 
(
SELECT 1,100 UNION ALL 
SELECT 1,200 
) 
SELECT * 
FROM [tblProject] AS pr 
LEFT JOIN [tblCostOfMaterials] AS ma ON pr.ProjectNumber=ma.ProjectNumber 
LEFT JOIN [tblCostOfOthers] AS ot ON pr.ProjectNumber=ot.ProjectNumber 

返回

ProjectNumber ProjectNumber TotalAmount ProjectNumber TotalAmount 
------------- ------------- ----------- ------------- ----------- 
1    1    101   1    100 
1    1    101   1    200 
1    1    201   1    100 
1    1    201   1    200 
1    1    301   1    100 
1    1    301   1    200 

你可以看到,值由另一個表中的匹配行數重複,因此SUM將不正確。