문제
두 개의 테이블이 있다고 가정해 보겠습니다.
알려진 시간:
ChargeNum CategoryID Month Hours 111111 1 2/1/09 10 111111 1 3/1/09 30 111111 1 4/1/09 50 222222 1 3/1/09 40 111111 2 4/1/09 50
알 수 없음시간:
ChargeNum Month Hours 111111 2/1/09 70 111111 3/1/09 40.5 222222 7/1/09 25.5
예상 결과가 다음과 같도록 월을 무시하고 이러한 시간을 단일 데이터 테이블로 그룹화해야 합니다.
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111 Unknown 110.5 222222 1 40 222222 Unknown 25.5
나는 이것을 알아낼 수없는 것 같습니다.어떤 도움이라도 대단히 감사하겠습니다!
편집하다:각 ChargeNum/Category 조합의 시간을 합산해야 합니다.이를 반영하기 위해 샘플 데이터를 업데이트했습니다.
해결책
사용해야합니다 UNION
두 쿼리의 결과를 결합합니다. 귀하의 경우 :
SELECT ChargeNum, CategoryID, SUM(Hours)
FROM KnownHours
GROUP BY ChargeNum, CategoryID
UNION ALL
SELECT ChargeNum, 'Unknown' AS CategoryID, SUM(Hours)
FROM UnknownHours
GROUP BY ChargeNum
참고 - 사용하는 경우 UNION ALL
위에서와 같이, 두 쿼리를 개별적으로 실행하는 것보다 느리지 않습니다.
다른 팁
예상 출력에서 마지막 두 번째 행 합계가 잘못되었습니다. 테이블의 데이터에 따르면 40이어야 하지만 쿼리는 다음과 같습니다.
Select ChargeNum, CategoryId, Sum(Hours)
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
결과는 다음과 같습니다.
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
우리는 이것을 한 걸음 더 멀리 가져 가서 50 시간 이상이 결합 될 때만 줄 만보고 싶다고 말할 수 있습니까?
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (SumHours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
그래서 나는 시도했다
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (Hours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
그러나 이것은 두 테이블에 시간의 합을주지 않습니다 ...
제휴하지 않습니다 StackOverflow