2014-03-29 49 views
3

我有,我需要轉動每小時的統計表格透視或逆轉置

的起始表格的形式是(或UNPIVOT):

[SystemID] [Hour] [CallStarts] [AvgDuration] 
    1   0  3   27 
    1   1  10   58 
    1   2  43   45 
    1   3  54   63 
    2   0  6   56 
    2   1  46   98 
    2   2  56   67 
    2   3  65   77 

而且我需要的輸出是:

[SystemID] [Statistic] [Hr0] [Hr1] [Hr2] [Hr3] 
    1  CallStarts 3 10  43 54 
    1  AvgDuration 27 58  45 63 
    2  CallStarts 6 46  56 65 
    2  AvgDuration 56 98  67 77 

我正在使用SQL Server 2008R2。我瞭解數據透視表的基礎知識,但我對他們沒有太多經驗。它的[統計]列讓我蒙受損失。

回答

1

這是一種方式來獲得這些結果沒有支點,這取決於索引和數據量可能更快:

SELECT SystemID, 
     MAX('CallStarts') AS Statistic, 
     SUM(CASE WHEN Hour = 0 THEN CallStarts ELSE 0 END) AS Hr0, 
     SUM(CASE WHEN Hour = 1 THEN CallStarts ELSE 0 END) AS Hr1, 
     SUM(CASE WHEN Hour = 2 THEN CallStarts ELSE 0 END) AS Hr2, 
     SUM(CASE WHEN Hour = 3 THEN CallStarts ELSE 0 END) AS Hr3 
FROM Table 
GROUP BY SystemID 
    UNION ALL 
SELECT SystemID, 
     MAX('AvgDuration') AS Statistic, 
     SUM(CASE WHEN Hour = 0 THEN AvgDuration ELSE 0 END) AS Hr0, 
     SUM(CASE WHEN Hour = 1 THEN AvgDuration ELSE 0 END) AS Hr1, 
     SUM(CASE WHEN Hour = 2 THEN AvgDuration ELSE 0 END) AS Hr2, 
     SUM(CASE WHEN Hour = 3 THEN AvgDuration ELSE 0 END) AS Hr3 
FROM Table 
GROUP BY SystemID 
ORDER BY SystemID, Statistic ASC 
+0

謝謝,這些都非常有幫助。我決定採用工會方法,因爲未來這個領域的人更容易維護。性能不是問題。另外,由於我一直在深入研究這種情況,顯然有些數據需要額外的處理,所以我不能使用直接的數據透視。 – dinobrago

1

你有正確的想法... unpivot,然後透視。也許有一個更好的辦法,但這個工程:

SELECT * 
FROM (
    SELECT SystemId, [Hour], [Stat], [Statistics] 
    FROM 
     (SELECT systemid, [hour], CallStarts, AvgDuration FROM t) nt 
    UNPIVOT 
     (stat FOR [Statistics] IN (CallStarts, AvgDuration)) AS ut 
    ) AS ap 
PIVOT 
    (SUM (Stat) FOR [Hour] IN ([0], [1], [2], [3], [4])) AS p 
ORDER BY [SystemId], [Statistics] DESC 

這裏是展示它的工作一個sqlfiddle:http://www.sqlfiddle.com/#!3/eb109/8/0

+0

謝謝, 這是對的。您可能想在末尾添加'[systemid]'的順序。 –

+0

感謝您的建議。我已經添加了該命令。 – attila

1

您可以查詢每個類型單獨統計,然後讓他們聯合在一起。我在SQL Fiddle上使用了@attila構建的相同模式。

WITH callS AS (SELECT systemid, hour, callstarts FROM t), 
callD AS (SELECT systemid, hour, avgduration FROM t) 

SELECT systemid, 'callStarts' AS [statistics], [0] as Hr0, [1] as Hr1, [2] as Hr2, [3] AS Hr3 
FROM callS pivot (max(callStarts) FOR hour IN ([0], [1], [2], [3])) AS p 

UNION ALL 

SELECT systemid, 'AvgDuration' AS [statistics], [0], [1], [2], [3] 
FROM callD pivot (max(avgduration) FOR hour IN ([0], [1], [2], [3])) AS p2 

ORDER BY systemid, [statistics] DESC; 

輸出可以看到在這裏看到:http://www.sqlfiddle.com/#!3/eb109/20/0