2009-06-29 81 views
7

我有一組數據,在名爲BWHourlyReadings表,例如:如何組合/合併來自兩個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 

對於每天有高達24個ServiceID讀數。

我得儘可能兩個獨立PIVOT查詢,一個用於InputOctets列,一個用於OutputOctets列(這裏只有一個顯示爲簡潔起見):

-- 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 

這給了我,我的InputOctets並在兩個OutputOctets單獨的結果集,例如:

InputOctetsPIVOT查詢結果:

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

OutputOctetsPIVOT查詢結果:

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

我需要製作一個像這樣的報告:

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 

如何合併兩個查詢結果,產生上述報告嗎?

更新:

我已經更新的數據所需的報告格式源表示例中的數據相匹配。我對這種混亂表示歉意。

回答

2

使用union或union all來合併2個結果。

+0

這將只是給我一個綜合作用的結果,一前一後。我需要在結果中合併兩個列集合。 – Kev 2009-06-29 11:44:39

3

我不知道你是如何計算你HourX |從你的(在輸出)(輸入|輸出)字節,但以下可能爲你工作

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 

用以下數據進行測試。

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

HourX(In | Out)來自PIVOT查詢,因此我可以將小時作爲列名。我們只能使用PIVOT爲InputOctets和OutputOctets生成一個單獨的結果。 – Kev 2009-06-29 12:23:24

+0

@Kev,我想你誤解了我。查詢應該產生你需要的列。我只是不知道你是如何從[InputOctet] 383088和[OutputOctet] 804249到[Hour1In] 350230878. – 2009-06-29 13:16:22

+0

道歉Lieven,我更新了數據並重新調整了一下這個問題,希望更清楚一點。 – Kev 2009-06-29 14:01:09

-1

這個答案來自SQL查詢的敏捷/ YAGNI學校.....

該報告是否絕對必須在這種格式?一個更簡單,更易維護的查詢可能會返回正確的信息,它只會略有不同。以下查詢以不同的格式返回數據?

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

創建一個@table變量,並把所有列在表並插入i將在該表中,並在從該表中最後一個選擇所有值。 意味着如果你想要24列,然後創建24列的表,並在這個插入一個接一個

1

以及你有兩個查詢...所以我想你可以只使用這兩個查詢作爲「表」在包裝查詢並加入它們


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 

或者如果您願意,可以使用INNER JOIN。這與在查詢中創建兩個視圖並加入這些視圖幾乎相同。

PS:未測試......就直SQL工作,但我有一個數據透視表沒有真正的經驗,這可能是掛機