2009-08-04 31 views
41

Nói rằng tôi có hai bảng:Kết hợp hai bảng cho một đầu ra

KnownHours:

 
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 

UnknownHours:

 
ChargeNum Month Hours 
111111  2/1/09 70 
111111  3/1/09 40.5 
222222  7/1/09 25.5 

tôi cần phải nhóm những giờ này, bỏ qua tháng, vào một đơn bảng dữ liệu để kết quả mong đợi của tôi là như sau:

 
ChargeNum CategoryID  Hours 
111111  1    90 
111111  2    50 
111111  Unknown  110.5 
222222  1    40 
222222  Unknown  25.5 

Tôi không thể hình dung điều này. Mọi sự trợ giúp sẽ rất được trân trọng!

EDIT: Tôi cần tính tổng số giờ cho mỗi kết hợp ChargeNum/Category. Tôi đã cập nhật dữ liệu mẫu để phản ánh điều này.

Trả lời

65

Bạn sẽ cần phải sử dụng UNION để kết hợp các kết quả của hai truy vấn. Trong trường hợp của bạn:

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 

Lưu ý - Nếu bạn sử dụng UNION ALL như trong ở trên, nó không có chậm hơn so với chạy hai truy vấn riêng biệt như nó không trùng lặp kiểm tra.

+0

Tôi đã nghe nói đây là đặc biệt chậm. Có cách nào khác để làm điều này? –

+0

Điều duy nhất có thể nhanh hơn là lưu trữ dữ liệu trong một bảng chứ không phải hai. Sử dụng 'CategoryID = NULL' cho các giờ không xác định. –

+4

@Matthew: Bạn nghe thấy điều đó ở đâu? 'union all' hoàn toàn nhanh. – Eric

11

Trong kết quả mong muốn của bạn, bạn đã có thứ hai hàng cuối cùng tổng không chính xác, nó phải là 40 theo dữ liệu trong bảng của bạn, nhưng đây là truy vấn:

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 

Và đây là kết quả :

ChargeNum CategoryId 
---------- ---------- ---------------------- 
111111  1   40 
111111  2   50 
111111  Unknown 70 
222222  1   40 
222222  Unknown 25.5 
+0

Cảm ơn bạn rất nhiều, đây là những gì tôi cần để giải quyết vấn đề của tôi! :) – Alexander

1

chúng ta có thể thực hiện việc này một bước xa hơn và nói rằng tôi chỉ muốn xem hàng khi kết hợp có 50 giờ hoặc nhiều hơn ... tôi đã cố gắng này, nhưng nhận được một lỗi mà nó không thể tìm thấy SumHours ...

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 

Vì vậy, tôi đã cố gắng

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 

Nhưng điều này là không cho tổng số giờ trên cả hai bảng ...

Các vấn đề liên quan