Convert these rows to columns

后端 未结 1 1538
余生分开走
余生分开走 2020-12-22 13:05

I have a fairly complicated query, and I\'m wondering how I can convert these from rows to columns, so they display in the following format. Average is the column that shoul

相关标签:
1条回答
  • 2020-12-22 14:03

    You could use a Cross tabs query to get your result.

    SELECT CONVERT(varchar(8), DATEADD(hh, onhour, 0), 108) + ' - ' 
           + CONVERT(varchar(8), DATEADD(hh, onhour+1, 0), 108) AS Hour, 
           Sum(totals)                  AS Total, 
           Avg(CASE WHEN DayOfWeek = 'Monday'    THEN totals END) AS Monday  , 
           Avg(CASE WHEN dayofweek = 'Tuesday'   THEN totals END) AS Tuesday , 
           Avg(CASE WHEN dayofweek = 'Wednesday' THEN totals END) AS Wednesday, 
           Avg(CASE WHEN dayofweek = 'Thursday'  THEN totals END) AS Thursday, 
           Avg(CASE WHEN dayofweek = 'Friday'    THEN totals END) AS Friday  , 
           Avg(CASE WHEN dayofweek = 'Saturday'  THEN totals END) AS Saturday, 
           Avg(CASE WHEN dayofweek = 'Sunday'    THEN totals END) AS Sunday
    FROM   (SELECT Datename(weekday, D.fordate) AS DayOfWeek, 
                   H.onhour, 
                   Isnull(T.totals, 0)          AS Totals 
            FROM   (SELECT DISTINCT T.fordate 
                    FROM   #visit AS T) AS D 
                   CROSS apply (VALUES(0), 
                                      (1), 
                                      (2), 
                                      (3), 
                                      (4), 
                                      (5), 
                                      (6), 
                                      (7), 
                                      (8), 
                                      (9), 
                                      (10), 
                                      (11), 
                                      (12), 
                                      (13), 
                                      (14), 
                                      (15), 
                                      (16), 
                                      (17), 
                                      (18), 
                                      (19), 
                                      (20), 
                                      (21), 
                                      (22), 
                                      (23)) AS H(onhour) 
                   LEFT OUTER JOIN #visit AS T 
                                ON H.onhour = T.onhour 
                                   AND D.fordate = T.fordate) a 
    WHERE  onhour NOT IN ( 0, 1, 2, 3, 
                           4, 5, 6, 7, 
                           20, 21, 22, 23 ) 
    GROUP  BY onhour 
    ORDER  BY onhour;
    
    0 讨论(0)
提交回复
热议问题