2011-02-17 4 views
1

이 쿼리가 올바르게 실행되지 않는 이유는 무엇입니까?2 테이블의 LEFT JOIN

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

+1

이 질문이 올바르게 수행되지 않은 이유는 무엇입니까? 어떤 종류의 오류 메시지가 없으면 도움이되지 않습니다. – Dai

+0

그 종류의 숙제 나 면접 질문입니까? 나는 큰 디자인 문제를 보지만, 상황에 따라 달라질 수있다. – Arvo

답변

1

각 테이블에 특정 프로젝트 번호에 대해 여러 행이 있으므로 동일한 값을 여러 번 계산한다고 가정합니다. 당신이 미니 직교

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 

당신은 값이 있음을 볼 수 있습니다 합류지고 있기 때문에 당신이

;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 

당신이 그 동작을 얻을 이유를 사용하여이 문제를 방지하려면 것은 SUM이 올바르지 않도록 다른 테이블의 일치하는 행 수만큼 복제됩니다.

+0

고맙습니다. – jack2000