2010-04-07 5 views
5

둘 다 [PROJECT] 및 [Value] 열이있는 두 테이블 AP와 INV가 있습니다. |여러 테이블의 SQL 합계 데이터

PROJECT :

나는 쿼리가 이런 일을 반환하려면 SUM_AP | SUM_INV

아래 코드를 생각해 냈지만 잘못된 결과를 반환합니다 (잘못되었습니다). 주어진 프로젝트 ID와 AP에서 N 행 및 해당 ID와 INV에서 M 행이있는 경우

SELECT AP.[PROJECT], 
SUM(AP.Value) AS SUM_AP, 
SUM(INV.Value) AS SUM_INV 
FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT]) 
WHERE AP.[PROJECT] = 'XXXXX' 
GROUP BY AP.[PROJECT] 

답변

11

요약하려는 값이 그룹화되어있어 중복 값이 ​​SUM에 포함되므로 쿼리 결과가 잘못되었습니다.

당신은 하위 선택의 부부와 함께 그것을 해결할 수 :

SELECT 
    AP1.[PROJECT], 
    (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP, 
    (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV 
FROM AP AS AP1 
    INNER JOIN INV AS INV1 
     ON (AP1.[PROJECT] =INV1.[PROJECT]) 
WHERE AP1.[PROJECT] = 'XXXXX' 
GROUP BY AP1.[PROJECT] 
+0

내가 "얻을 당신의 일부로 지정된 식 '프로젝트'를 포함하지 않는 쿼리를 실행하려고 여기

select SUM(gpCutBody.actualQty) as cutQty , SUM(gpSewBody.quantity) as sewQty from jobOrder inner join gpCutHead on gpCutHead.joNum = jobOrder.joNum inner join gpSewHead on gpSewHead.joNum = jobOrder.joNum inner join gpCutBody on gpCutBody.gpCutID = gpCutHead.gpCutID inner join gpSewBody on gpSewBody.gpSewID = gpSewHead.gpSewID where jobOrder.joNum = '36' 

는 ERD에 대한 링크입니다 집계 함수. " – Iulian

+0

다른 그룹화 열을 피하기 위해 두 번째 하위 쿼리를 업데이트했습니다. 다시해볼 수 있을까요? – Prutswonder

+0

올바른 결과를 반환하는 지금은 잘 작동하고있어 덕분에 – Iulian

2

는, 다음은 해당 프로젝트에 대한 N*M 행의 총있을 것이다 프로젝트 ID에 두 테이블 간의 조인 왜냐하면 AP의 동일한 행이 해당 프로젝트 ID가있는 INV의 모든 행에 대해 반복되고 그 반대의 경우도 마찬가지이기 때문입니다. 따라서 왜 당신의 카운트가 가장 가능성이 낮습니까 (왜냐하면 그것은 조인으로부터의 반복 때문에 주어진 테이블의 같은 행을 여러 번 카운트하고 있기 때문입니다).

대신 두 개의 하위 쿼리 결과 (첫 번째 테이블을 프로젝트 ID로 그룹화하고 합계)와 두 번째 하위 쿼리 (프로젝트 ID별로 다른 테이블을 그룹화하는 결과) 간의 조인을 시도 할 수 있습니다. sum - 각 프로젝트 ID에 대한 합계가 1 행만 있으면 가입하십시오.

-1

보십시오 : 프로젝트가 부모 테이블 인 경우

SELECT AP.[PROJECT] AS PROJECT, SUM(AP.[Value]) AS SUM_AP, SUM(INV.[Value]) AS SUM_INV 
FROM AP, INV 
WHERE AP.[PROJECT] = INV.[PROJECT] 
AND AP.[PROJECT] = 'XXXXX' 
GROUP BY AP.[PROJECT] 
+0

이 내 잘못한 결과를 반환합니다. ( – Iulian

0

, 프로젝트 테이블에서 선택하고, 어떻게해야 두 개의 하위 테이블에 왼쪽 외부 조인 :

SELECT PROJECT.PROJECT_ID, SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV 
FROM PROJECT 
LEFT OUTER JOIN AP ON (AP.[PROJECT] = PROJECT.[PROJECT_ID]) 
LEFT OUTER JOIN INV ON (INV.[PROJECT] = PROJECT.[PROJECT_ID]) 
WHERE PROJECT.[PROJECT_ID] = 'XXXXX' 
GROUP BY PROJECT.[PROJECT_ID] 
0

두 합계 계산을 분리 할 수 ​​있습니다. 뿐만 아니라 외부 쿼리에 SummedInv.SUM_INVSummedInv 부질 project에 그룹화됩니다

SELECT 
    AP.[PROJECT] 
, SUM(AP.Value) AS SUM_AP 
, SummedInv as SUM_INV 
FROM AP 
LEFT JOIN (
    SELECT PROJECT, SUM(Value) AS SUM_INV 
    FROM INV 
    GROUP BY PROJECT 
) SummedInv ON SummedInv.Project = AP.Project 
GROUP BY AP.PROJECT, SummedInv.SUM_INV 

때문에,이 그룹에 안전 : 내가 생각할 수있는 한 가지 방법은 같은 하위 쿼리로 재고 계산을 이동하는 것입니다.

관련 문제