2009-06-29 46 views
7

Tôi có một tập hợp các dữ liệu trong một bảng tên BWHourlyReadings, ví dụ:Làm cách nào để kết hợp/hợp nhất các cột từ hai kết quả truy vấn SQL?

ServiceID  Hour InputOctets OutputOctets 
=========  ==== =========== ================= 
27222   1  383088   804249 
27222   2  270529   688683 
27222   3  247251   290124 
... up to 24 hours of data 
27222   24  236053   239165 

28900   1  883011   914249 
28900   3  444251   891124 
... up to 24 hours of data 
28900   24  123053   452165 

Đối với mỗi ngày có đến 24 bài đọc mỗi ServiceID.

Tôi đã có như xa như hai riêng biệtPIVOT truy vấn, một cho cột InputOctets và một cho cột OutputOctets (chỉ có một trình bày ở đây cho ngắn gọn):

-- Replace HourXIn with HourXOut for OutputOctets 
SELECT ServiceID, [1] AS 'Hour1In', [2] AS 'Hour2In', [3] AS 'Hour3In', ... 
FROM 
(
    SELECT 
     ServiceID, 
     Hour, 
     TotalInputOctets -- Other query has OutputOctets here instead 
    FROM 
     BWHourlyReadings 

) AS bw 
PIVOT 
( 
    MAX(TotalInputOctets) -- Other query has OutputOctets here instead 
    FOR [Hour] IN ([1], [2], [3], ... [24]) 
) AS pvt 

này mang lại cho tôi InputOctets của tôi và OutputOctets trong hai bộ kết quả riêng biệt, ví dụ:

kết quả PIVOT truy vấn trên InputOctets:

012.351.
ServiceID Hour1In Hour2In Hour3In . Hour24In  
========= ======= ======= ======= ========  
27222  383088 270529 247251 236053 
28900  883011 0  444251 123053 

Kết quả PIVOT truy vấn trên OutputOctets:

ServiceID Hour1Out Hour2Out Hour3Out .. Hour24Out  
========= ======== ======== ======== ======== 
27222  804249 688683 290124  239165 
28900  914249 0  891124  452165 

tôi cần phải tạo ra một báo cáo như thế này:

ServiceID Hour1In Hour1Out Hour2In Hour2Out Hour3In Hour3Out .. Hour24In Hour24Out  
========= ======= ======== ======= ======== ======= ======== ======= ======== 
27222  383088 804249 270529 688683 247251 290124  236053 239165 
28900  883011 914249 0  0  444251 891124  123053 452165 

Làm thế nào để hợp nhất hai kết quả truy vấn để tạo báo cáo ở trên?

Cập nhật:

Tôi đã cập nhật dữ liệu theo định dạng báo cáo mong muốn để phù hợp với dữ liệu trong ví dụ bảng nguồn. Tôi xin lỗi về sự hiểu lầm.

Trả lời

2

sử dụng liên minh hoặc công đoàn để kết hợp 2 kết quả.

+0

Đó sẽ chỉ cho tôi một kết quả kết hợp, một sau khi khác . Tôi cần hợp nhất hai tập hợp cột lại với nhau trên kết quả. – Kev

3

Tôi không có ý tưởng làm thế nào bạn tính toán HourX của bạn (Trong | Out) từ bạn (Input | Output) Octets nhưng sau đây có thể làm việc cho bạn

SELECT 
    ServiceID 
    , [Hour1In] = SUM(CASE WHEN Hour = 1 THEN InputOctets ELSE 0 END) 
    , [Hour1Out] = SUM(CASE WHEN Hour = 1 THEN OutputOctets ELSE 0 END) 
    , [Hour2In] = SUM(CASE WHEN Hour = 2 THEN InputOctets ELSE 0 END) 
    , [Hour2Out] = SUM(CASE WHEN Hour = 2 THEN OutputOctets ELSE 0 END) 
    , [Hour3In] = SUM(CASE WHEN Hour = 3 THEN InputOctets ELSE 0 END) 
    , [Hour3Out] = SUM(CASE WHEN Hour = 3 THEN OutputOctets ELSE 0 END) 
    -- , ... 
    , [Hour24In] = SUM(CASE WHEN Hour = 24 THEN InputOctets ELSE 0 END) 
    , [Hour24Out] = SUM(CASE WHEN Hour = 24 THEN OutputOctets ELSE 0 END) 
FROM 
    @BWHourlyReadings 
GROUP BY 
    ServiceID 

Thử nghiệm với dữ liệu sau.

DECLARE @BWHourlyReadings TABLE (ServiceID INT, Hour INT, InputOctets INTEGER, OutputOctets INTEGER) 

INSERT INTO @BWHourlyReadings VALUES (27222, 1, 383088, 804249) 
INSERT INTO @BWHourlyReadings VALUES (27222, 2, 270529, 688683) 
INSERT INTO @BWHourlyReadings VALUES (27222, 3, 247251, 290124) 
INSERT INTO @BWHourlyReadings VALUES (27222, 24, 236053, 239165) 
+1

Giờ (In | Out) xuất phát từ truy vấn PIVOT để tôi nhận giờ làm tên cột. Chúng tôi chỉ có thể tạo ra một kết quả riêng biệt bằng cách sử dụng PIVOT cho InputOctets và sau đó là OutputOctets. – Kev

+0

@Kev, tôi nghĩ bạn đã hiểu lầm tôi. Truy vấn sẽ tạo ra các cột bạn cần. Tôi chỉ không biết làm thế nào bạn nhận được từ [InputOctet] 383088 & [OutputOctet] 804249 tới [Hour1In] 350230878. –

+0

Xin lỗi, tôi đã cập nhật dữ liệu và sửa lại câu hỏi một chút để hy vọng làm cho nó rõ ràng hơn. – Kev

-1

câu trả lời này xuất phát từ trường Agile/YAGNI các truy vấn SQL .....

Liệu các báo cáo hoàn toàn phải ở định dạng này? Một truy vấn đơn giản hơn, dễ bảo trì hơn có thể trả lại thông tin chính xác, nó sẽ chỉ được trình bày hơi khác một chút. Truy vấn sau trả về dữ liệu theo một định dạng hơi khác?

SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets 
FROM BWHourlyReadings 
GROUP BY serviceid, hour 
ORDER BY serviceid, hour 
+0

Có dữ liệu cần phải ở định dạng crosstab. – Kev

0

Tạo một biến @table và đặt tất cả các cột trong bảng đó và chèn tất cả các giá trị trong bảng đó và chọn cuối cùng từ bảng đó. có nghĩa là nếu bạn muốn 24 cột, sau đó tạo bảng có 24 cột và chèn từng cột một trong số này

1

bạn có hai truy vấn ... vì vậy tôi nghĩ bạn chỉ có thể sử dụng hai truy vấn đó dưới dạng "bảng" truy vấn trình bao bọc và tham gia họ


select * from 
(*insert your big-ass OutputOctets query SQL here*) oo, 
(*insert your big-ass InputOctets query SQL here*) io 
where oo.ServiceID = oi.ServiceID 

hoặc sử dụng INNER JOIN nếu bạn muốn.điều này khá giống với việc thực hiện hai chế độ xem trong số các truy vấn của bạn và sau đó tham gia các chế độ xem đó.

PS: không được kiểm tra ... sẽ làm việc với SQL thẳng, nhưng tôi không có kinh nghiệm thực tế với các bảng tổng hợp và đó có thể là hang-up

+0

Giải pháp này sẽ hiệu quả nhưng Lieven có khả năng biểu diễn và dễ đọc hơn. –

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