СЛЕДУЕТ ПРИСОЕДИНЯТЬСЯ В 2 СТОЛ - PullRequest
1 голос
/ 17 февраля 2011

Почему этот запрос не выполняется правильно?

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

1 Ответ

1 голос
/ 17 февраля 2011

Я предполагаю, что вы имеете в виду, что, поскольку каждая таблица имеет несколько строк для определенного номера проекта, вы учитываете одни и те же значения несколько раз.Чтобы избежать этого, вы можете использовать

;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

Youможно увидеть, что значения дублируются количеством совпадающих строк в другой таблице, поэтому SUM будет неправильным.

...