Search code examples
sql-serverpivot-tableunpivot

Pivot or unpivot


I have a table with hourly statistics that I need to pivot (or unpivot?)

The starting table is of the form:

[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  

And I need the output to be:

[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  

I'm using SQL Server 2008R2. I understand the basics of pivot tables but I don't have much experience with them. Its the [Statistic] column that has me for a loss.


Solution

  • Here is a way to get these results without pivot, depending on indexes and data size it may be faster:

    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