0

我有 48 列来显示每 1/2 小时和相应日期的数据。一切都好,突然我的客户想要改变这个,以便每天只显示这 48 列的最大值。我厌倦了 Max 转换、pivot 等,但徒劳无功。

目前它就像

  Date           [12:00am] [12:30am] ....   [11:30pm]        
      01/01/2012         5        6               9      
      01/02/2012         15       4               8       
      01/03/2012         1        19              0        

但我必须得到它(只有 2 列)

Date          Max(out of these 48 cols)
01/01/2012         9
01/02/2012         15
01/03/2012         19

感谢任何帮助。

注意:我没有任何直接列来计算最大值或总和。

代码片段:

    DECLARE     @prmOffSet int,@prmStartDate datetime, @prmEndDate datetime
    SET @prmStartDate = '01/01/2012';
    SET @prmEndDate = '01/10/2012';
    SET @prmOffSet = '-8';
    SELECT  CONVERT(varchar(10), CAST

(StartDate AS DateTime), 101) AS StartDate, 
        SUM(TwelveAM) AS [12:00am],
        SUM(TwelveThirtyAM) AS [12:30am], 
        SUM(OneAM) AS [1:00am], 
        SUM(OneThirtyAM) AS [1:30am],
        SUM(TwoAM) AS [2:00am], 
        SUM(TwoThirtyAM) AS [2:30am],
        SUM(ThreeAM) AS [3:00am],
        SUM(ThreeThirtyAM) AS [3:30am], 
        SUM(FourAM) AS [4:00am], 
        SUM(FourThirtyAM) AS [4:30am],
        SUM(FiveAM) AS [5:00am],
        SUM(FiveThirtyAM) AS [5:30am], 
        SUM(SixAM) AS [6:00am], 
        SUM(SixThirtyAM) AS [6:30am],
        SUM(SevenAM) AS [7:00am],
        SUM(SevenThirtyAM) AS [7:30am], 
        SUM(EightAM) AS [8:00am],
        SUM(EightThirtyAM) AS [8:30am],  
        SUM(NineAM) AS [9:00am],
        SUM(NineThirtyAM) AS [9:30am], 
        SUM(TenAM) AS [10:00am],
        SUM(TenThirtyAM) AS [10:30am], 
        SUM(ElevenAM) AS [11:00am], 
        SUM(ElevenThirtyAM) AS [11:30am],
        SUM(TwelvePM) AS [12:00pm],
        SUM(TwelveThirtyPM) AS [12:30pm], 
        SUM(OnePM) AS [1:00pm], 
        SUM(OneThirtyPM) AS [1:30pm],
        SUM(TwoPM) AS [2:00pm], 
        SUM(TwoThirtyPM) AS [2:30pm],
        SUM(ThreePM) AS [3:00pm], 
        SUM(ThreeThirtyPM) AS [3:30pm],
        SUM(FourPM) AS [4:00pm], 
        SUM(FourThirtyPM) AS [4:30pm],
        SUM(FivePM) AS [5:00pm],
        SUM(FiveThirtyPM) AS [5:30pm], 
        SUM(SixPM) AS [6:00pm], 
        SUM(SixThirtyPM) AS [6:30pm],
        SUM(SevenPM) AS [7:00pm], 
        SUM(SevenThirtyPM) AS [7:30pm],
        SUM(EightPM) AS [8:00pm], 
        SUM(EightThirtyPM) AS [8:30pm],
        SUM(NinePM) AS [9:00pm], 
        SUM(NineThirtyPM) AS [9:30pm],
        SUM(TenPM) AS [10:00pm],
        SUM(TenThirtyPM) AS [10:30pm], 
        SUM(ElevenPM) AS [11:00pm],
        SUM(ElevenThirtyPM) AS [11:30pm]
FROM (
        SELECT DisplayName, StartDate, EndDate, StartHours, EndHours, 
            CASE WHEN StartHours <= 0 AND EndHours >= 0 THEN 1 ELSE 0 END AS TwelveAM, 
            CASE WHEN StartHours <= 0.5 AND EndHours >= 0.5 THEN 1 ELSE 0 END AS TwelveThirtyAM,
            CASE WHEN StartHours <= 1 AND EndHours >= 1 THEN 1 ELSE 0 END AS OneAM, 
            CASE WHEN StartHours <= 1.5 AND EndHours >= 1.5 THEN 1 ELSE 0 END AS OneThirtyAM,
            CASE WHEN StartHours <= 2 AND EndHours >= 2 THEN 1 ELSE 0 END AS TwoAM, 
            CASE WHEN StartHours <= 2.5 AND EndHours >= 2.5 THEN 1 ELSE 0 END AS TwoThirtyAM,
            CASE WHEN StartHours <= 3 AND EndHours >= 3 THEN 1 ELSE 0 END AS ThreeAM, 
            CASE WHEN StartHours <= 3.5 AND EndHours >= 3.5 THEN 1 ELSE 0 END AS ThreeThirtyAM,
            CASE WHEN StartHours <= 4 AND EndHours >= 4 THEN 1 ELSE 0 END AS FourAM, 
            CASE WHEN StartHours <= 4.5 AND EndHours >= 4.5 THEN 1 ELSE 0 END AS FourThirtyAM,
            CASE WHEN StartHours <= 5 AND EndHours >= 5 THEN 1 ELSE 0 END AS FiveAM, 
            CASE WHEN StartHours <= 5.5 AND EndHours >= 5.5 THEN 1 ELSE 0 END AS FiveThirtyAM,
            CASE WHEN StartHours <= 6 AND EndHours >= 6 THEN 1 ELSE 0 END AS SixAM,
            CASE WHEN StartHours <= 6.5 AND EndHours >= 6.5 THEN 1 ELSE 0 END AS SixThirtyAM, 
            CASE WHEN StartHours <= 7 AND EndHours >= 7 THEN 1 ELSE 0 END AS SevenAM, 
            CASE WHEN StartHours <= 7.5 AND EndHours >= 7.5 THEN 1 ELSE 0 END AS SevenThirtyAM,
            CASE WHEN StartHours <= 8 AND EndHours >= 8 THEN 1 ELSE 0 END AS EightAM, 
            CASE WHEN StartHours <= 8.5 AND EndHours >= 8.5 THEN 1 ELSE 0 END AS EightThirtyAM,
            CASE WHEN StartHours <= 9 AND EndHours >= 9 THEN 1 ELSE 0 END AS NineAM, 
            CASE WHEN StartHours <= 9.5 AND EndHours >= 9.5 THEN 1 ELSE 0 END AS NineThirtyAM,
            CASE WHEN StartHours <= 10.0 AND EndHours >= 10.0 THEN 1 ELSE 0 END AS TenAM, 
            CASE WHEN StartHours <= 10.5 AND EndHours >= 10.5 THEN 1 ELSE 0 END AS TenThirtyAM,         
            CASE WHEN StartHours <= 11 AND EndHours >= 11 THEN 1 ELSE 0 END AS ElevenAM,
            CASE WHEN StartHours <= 11.5 AND EndHours >= 11.5 THEN 1 ELSE 0 END AS ElevenThirtyAM,
            CASE WHEN StartHours <= 12 AND EndHours >= 12 THEN 1 ELSE 0 END AS TwelvePM,
            CASE WHEN StartHours <= 12.5 AND EndHours >= 12.5 THEN 1 ELSE 0 END AS TwelveThirtyPM, 
            CASE WHEN StartHours <= 13 AND EndHours >= 13 THEN 1 ELSE 0 END AS OnePM,
            CASE WHEN StartHours <= 13.5 AND EndHours >= 13.5 THEN 1 ELSE 0 END AS OneThirtyPM, 
            CASE WHEN StartHours <= 14 AND EndHours >= 14 THEN 1 ELSE 0 END AS TwoPM, 
            CASE WHEN StartHours <= 14.5 AND EndHours >= 14.5 THEN 1 ELSE 0 END AS TwoThirtyPM,
            CASE WHEN StartHours <= 15 AND EndHours >= 15 THEN 1 ELSE 0 END AS ThreePM,
            CASE WHEN StartHours <= 15.5 AND EndHours >= 15.5 THEN 1 ELSE 0 END AS ThreeThirtyPM, 
            CASE WHEN StartHours <= 16 AND EndHours >= 16 THEN 1 ELSE 0 END AS FourPM, 
            CASE WHEN StartHours <= 16.5 AND EndHours >= 16.5 THEN 1 ELSE 0 END AS FourThirtyPM,
            CASE WHEN StartHours <= 17 AND EndHours >= 17 THEN 1 ELSE 0 END AS FivePM, 
            CASE WHEN StartHours <= 17.5 AND EndHours >= 17.5 THEN 1 ELSE 0 END AS FiveThirtyPM,
            CASE WHEN StartHours <= 18 AND EndHours >= 18 THEN 1 ELSE 0 END AS SixPM,
            CASE WHEN StartHours <= 18.5 AND EndHours >= 18.5 THEN 1 ELSE 0 END AS SixThirtyPM, 
            CASE WHEN StartHours <= 19 AND EndHours >= 19 THEN 1 ELSE 0 END AS SevenPM,
            CASE WHEN StartHours <= 19.5 AND EndHours >= 19.5 THEN 1 ELSE 0 END AS SevenThirtyPM,
            CASE WHEN StartHours <= 20 AND EndHours >= 20 THEN 1 ELSE 0 END AS EightPM,
            CASE WHEN StartHours <= 20.5 AND EndHours >= 20.5 THEN 1 ELSE 0 END AS EightThirtyPM, 
            CASE WHEN StartHours <= 21 AND EndHours >= 21 THEN 1 ELSE 0 END AS NinePM, 
            CASE WHEN StartHours <= 21.5 AND EndHours >= 21.5 THEN 1 ELSE 0 END AS NineThirtyPM,
            CASE WHEN StartHours <= 22 AND EndHours >= 22 THEN 1 ELSE 0 END AS TenPM, 
            CASE WHEN StartHours <= 22.5 AND EndHours >= 22.5 THEN 1 ELSE 0 END AS TenThirtyPM,
            CASE WHEN StartHours <= 23 AND EndHours >= 23 THEN 1 ELSE 0 END AS ElevenPM,
            CASE WHEN StartHours <= 23.5 AND EndHours >= 23.5 THEN 1 ELSE 0 END AS ElevenThirtyPM
        FROM (
                SELECT DisplayName, StartDate, EndDate, StartHours, EndHours
                FROM (
                    SELECT DisplayName, 
                        CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) AS StartDate, 
                        DATEADD(hh, @prmOffSet, SL.SessionUTCStart) as Start,
                        CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) AS FLOAT)) AS DATETIME) AS EndDate, 
                        DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) as [End],
                        DATEPART(hh, DATEADD(hh, @prmOffSet, SL.SessionUTCStart)) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, SL.SessionUTCStart))<30 THEN 0.0 ELSE 0.5 END AS StartHours, 
                        DATEPART(hh, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity))) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)))<30 THEN 0.0 ELSE 0.5 END AS EndHours
                    FROM tbSessionLog SL LEFT OUTER JOIN tbSessions S ON SL.SessionID=S.SessionID
                    WHERE (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) >= CAST(@prmStartDate AS DATETIME)) AND 
                          (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) <= CAST(@prmEndDate AS DATETIME))) AS Sess
                GROUP BY DisplayName, StartDate, EndDate, StartHours, EndHours) AS DtlSess) AS HourCount
GROUP BY StartDate
4

2 回答 2

0

我可以看到您可以轻松获得此结果的唯一方法是不执行PIVOT并创建 48 列。

如果您创建 48 列,那么您将不得不通过UNPIVOT这些列来获取Max每天的总数。

我建议对您当前的查询稍作更改,如下所示。不要使用该CASE语句来创建新列,而是为每个小时块使用一个带有标识符的列:

CASE 
  WHEN StartHours <= 0 AND EndHours >= 0 THEN 'TwelveAM'  
  WHEN StartHours <= 0.5 AND EndHours >= 0.5 THEN 'TwelveThirtyAM'
  WHEN StartHours <= 1 AND EndHours >= 1 THEN 'OneAM' 
  WHEN StartHours <= 1.5 AND EndHours >= 1.5 THEN 'OneThirtyAM'
  WHEN StartHours <= 2 AND EndHours >= 2 THEN 'TwoAM' 
  WHEN StartHours <= 2.5 AND EndHours >= 2.5 THEN 'TwoThirtyAM'
END as Hours

一旦这些数据在单列中,您就可以每小时计算一次,然后您就可以获得Max每天的总数。

因此,您的查询将与此类似:

SELECT StartDate, Max(TotalHours)
FROM
(
  SELECT StartDate, Hours, count(Hours) TotalHours
  FROM
  (
    SELECT DisplayName, StartDate, EndDate, StartHours, EndHours, 
      CASE 
        WHEN StartHours <= 0 AND EndHours >= 0 THEN 'TwelveAM'  
        WHEN StartHours <= 0.5 AND EndHours >= 0.5 THEN 'TwelveThirtyAM'
        WHEN StartHours <= 1 AND EndHours >= 1 THEN 'OneAM' 
        WHEN StartHours <= 1.5 AND EndHours >= 1.5 THEN 'OneThirtyAM'
        WHEN StartHours <= 2 AND EndHours >= 2 THEN 'TwoAM' 
        WHEN StartHours <= 2.5 AND EndHours >= 2.5 THEN 'TwoThirtyAM'
        -- add other WHEN statements here
      END as Hours
    FROM 
    (
      SELECT DisplayName, StartDate, EndDate, StartHours, EndHours
      FROM 
      (
        SELECT DisplayName, 
         CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) AS StartDate, 
         DATEADD(hh, @prmOffSet, SL.SessionUTCStart) as Start,
         CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) AS FLOAT)) AS DATETIME) AS EndDate, 
         DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) as [End],
         DATEPART(hh, DATEADD(hh, @prmOffSet, SL.SessionUTCStart)) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, SL.SessionUTCStart))<30 THEN 0.0 ELSE 0.5 END AS StartHours, 
         DATEPART(hh, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity))) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)))<30 THEN 0.0 ELSE 0.5 END AS EndHours
        FROM tbSessionLog SL 
        LEFT OUTER JOIN tbSessions S 
          ON SL.SessionID=S.SessionID
        WHERE (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) >= CAST(@prmStartDate AS DATETIME)) AND 
          (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) <= CAST(@prmEndDate AS DATETIME))
      ) AS Sess
      GROUP BY DisplayName, StartDate, EndDate, StartHours, EndHours
    ) AS DtlSess
  ) src
  GROUP BY StartDate, Hours
) t
GROUP BY StartDate

这是一个SQL Fiddle 演示,其中包含您的查询的缩短版本。

于 2013-02-21T12:02:45.900 回答
0

@bluefeet,感谢您的及时回复。我已经使用 unpivot 解决了它。作为记录,可能有类似问题的人可以参考下面的解决方案。

 SELECT StartDate,Max(col) As MaxValue
FROM
(
    SELECT StartDate, col
    FROM
    (
        SELECT  CONVERT(varchar(10), CAST(StartDate AS DateTime), 101) AS StartDate, 
                SUM(TwelveAM) AS [12:00am],
                SUM(TwelveThirtyAM) AS [12:30am], 
                SUM(OneAM) AS [1:00am], 
                SUM(OneThirtyAM) AS [1:30am],
                SUM(TwoAM) AS [2:00am], 
                SUM(TwoThirtyAM) AS [2:30am],
                SUM(ThreeAM) AS [3:00am],
                SUM(ThreeThirtyAM) AS [3:30am], 
                SUM(FourAM) AS [4:00am], 
                SUM(FourThirtyAM) AS [4:30am],
                SUM(FiveAM) AS [5:00am],
                SUM(FiveThirtyAM) AS [5:30am], 
                SUM(SixAM) AS [6:00am], 
                SUM(SixThirtyAM) AS [6:30am],
                SUM(SevenAM) AS [7:00am],
                SUM(SevenThirtyAM) AS [7:30am], 
                SUM(EightAM) AS [8:00am],
                SUM(EightThirtyAM) AS [8:30am],  
                SUM(NineAM) AS [9:00am],
                SUM(NineThirtyAM) AS [9:30am], 
                SUM(TenAM) AS [10:00am],
                SUM(TenThirtyAM) AS [10:30am], 
                SUM(ElevenAM) AS [11:00am], 
                SUM(ElevenThirtyAM) AS [11:30am],
                SUM(TwelvePM) AS [12:00pm],
                SUM(TwelveThirtyPM) AS [12:30pm], 
                SUM(OnePM) AS [1:00pm], 
                SUM(OneThirtyPM) AS [1:30pm],
                SUM(TwoPM) AS [2:00pm], 
                SUM(TwoThirtyPM) AS [2:30pm],
                SUM(ThreePM) AS [3:00pm], 
                SUM(ThreeThirtyPM) AS [3:30pm],
                SUM(FourPM) AS [4:00pm], 
                SUM(FourThirtyPM) AS [4:30pm],
                SUM(FivePM) AS [5:00pm],
                SUM(FiveThirtyPM) AS [5:30pm], 
                SUM(SixPM) AS [6:00pm], 
                SUM(SixThirtyPM) AS [6:30pm],
                SUM(SevenPM) AS [7:00pm], 
                SUM(SevenThirtyPM) AS [7:30pm],
                SUM(EightPM) AS [8:00pm], 
                SUM(EightThirtyPM) AS [8:30pm],
                SUM(NinePM) AS [9:00pm], 
                SUM(NineThirtyPM) AS [9:30pm],
                SUM(TenPM) AS [10:00pm],
                SUM(TenThirtyPM) AS [10:30pm], 
                SUM(ElevenPM) AS [11:00pm],
                SUM(ElevenThirtyPM) AS [11:30pm]
        FROM (
                SELECT DisplayName, StartDate, EndDate, StartHours, EndHours, 
                    CASE WHEN StartHours <= 0 AND EndHours >= 0 THEN 1 ELSE 0 END AS TwelveAM, 
                    CASE WHEN StartHours <= 0.5 AND EndHours >= 0.5 THEN 1 ELSE 0 END AS TwelveThirtyAM,
                    CASE WHEN StartHours <= 1 AND EndHours >= 1 THEN 1 ELSE 0 END AS OneAM, 
                    CASE WHEN StartHours <= 1.5 AND EndHours >= 1.5 THEN 1 ELSE 0 END AS OneThirtyAM,
                    CASE WHEN StartHours <= 2 AND EndHours >= 2 THEN 1 ELSE 0 END AS TwoAM, 
                    CASE WHEN StartHours <= 2.5 AND EndHours >= 2.5 THEN 1 ELSE 0 END AS TwoThirtyAM,
                    CASE WHEN StartHours <= 3 AND EndHours >= 3 THEN 1 ELSE 0 END AS ThreeAM, 
                    CASE WHEN StartHours <= 3.5 AND EndHours >= 3.5 THEN 1 ELSE 0 END AS ThreeThirtyAM,
                    CASE WHEN StartHours <= 4 AND EndHours >= 4 THEN 1 ELSE 0 END AS FourAM, 
                    CASE WHEN StartHours <= 4.5 AND EndHours >= 4.5 THEN 1 ELSE 0 END AS FourThirtyAM,
                    CASE WHEN StartHours <= 5 AND EndHours >= 5 THEN 1 ELSE 0 END AS FiveAM, 
                    CASE WHEN StartHours <= 5.5 AND EndHours >= 5.5 THEN 1 ELSE 0 END AS FiveThirtyAM,
                    CASE WHEN StartHours <= 6 AND EndHours >= 6 THEN 1 ELSE 0 END AS SixAM,
                    CASE WHEN StartHours <= 6.5 AND EndHours >= 6.5 THEN 1 ELSE 0 END AS SixThirtyAM, 
                    CASE WHEN StartHours <= 7 AND EndHours >= 7 THEN 1 ELSE 0 END AS SevenAM, 
                    CASE WHEN StartHours <= 7.5 AND EndHours >= 7.5 THEN 1 ELSE 0 END AS SevenThirtyAM,
                    CASE WHEN StartHours <= 8 AND EndHours >= 8 THEN 1 ELSE 0 END AS EightAM, 
                    CASE WHEN StartHours <= 8.5 AND EndHours >= 8.5 THEN 1 ELSE 0 END AS EightThirtyAM,
                    CASE WHEN StartHours <= 9 AND EndHours >= 9 THEN 1 ELSE 0 END AS NineAM, 
                    CASE WHEN StartHours <= 9.5 AND EndHours >= 9.5 THEN 1 ELSE 0 END AS NineThirtyAM,
                    CASE WHEN StartHours <= 10.0 AND EndHours >= 10.0 THEN 1 ELSE 0 END AS TenAM, 
                    CASE WHEN StartHours <= 10.5 AND EndHours >= 10.5 THEN 1 ELSE 0 END AS TenThirtyAM,         
                    CASE WHEN StartHours <= 11 AND EndHours >= 11 THEN 1 ELSE 0 END AS ElevenAM,
                    CASE WHEN StartHours <= 11.5 AND EndHours >= 11.5 THEN 1 ELSE 0 END AS ElevenThirtyAM,
                    CASE WHEN StartHours <= 12 AND EndHours >= 12 THEN 1 ELSE 0 END AS TwelvePM,
                    CASE WHEN StartHours <= 12.5 AND EndHours >= 12.5 THEN 1 ELSE 0 END AS TwelveThirtyPM, 
                    CASE WHEN StartHours <= 13 AND EndHours >= 13 THEN 1 ELSE 0 END AS OnePM,
                    CASE WHEN StartHours <= 13.5 AND EndHours >= 13.5 THEN 1 ELSE 0 END AS OneThirtyPM, 
                    CASE WHEN StartHours <= 14 AND EndHours >= 14 THEN 1 ELSE 0 END AS TwoPM, 
                    CASE WHEN StartHours <= 14.5 AND EndHours >= 14.5 THEN 1 ELSE 0 END AS TwoThirtyPM,
                    CASE WHEN StartHours <= 15 AND EndHours >= 15 THEN 1 ELSE 0 END AS ThreePM,
                    CASE WHEN StartHours <= 15.5 AND EndHours >= 15.5 THEN 1 ELSE 0 END AS ThreeThirtyPM, 
                    CASE WHEN StartHours <= 16 AND EndHours >= 16 THEN 1 ELSE 0 END AS FourPM, 
                    CASE WHEN StartHours <= 16.5 AND EndHours >= 16.5 THEN 1 ELSE 0 END AS FourThirtyPM,
                    CASE WHEN StartHours <= 17 AND EndHours >= 17 THEN 1 ELSE 0 END AS FivePM, 
                    CASE WHEN StartHours <= 17.5 AND EndHours >= 17.5 THEN 1 ELSE 0 END AS FiveThirtyPM,
                    CASE WHEN StartHours <= 18 AND EndHours >= 18 THEN 1 ELSE 0 END AS SixPM,
                    CASE WHEN StartHours <= 18.5 AND EndHours >= 18.5 THEN 1 ELSE 0 END AS SixThirtyPM, 
                    CASE WHEN StartHours <= 19 AND EndHours >= 19 THEN 1 ELSE 0 END AS SevenPM,
                    CASE WHEN StartHours <= 19.5 AND EndHours >= 19.5 THEN 1 ELSE 0 END AS SevenThirtyPM,
                    CASE WHEN StartHours <= 20 AND EndHours >= 20 THEN 1 ELSE 0 END AS EightPM,
                    CASE WHEN StartHours <= 20.5 AND EndHours >= 20.5 THEN 1 ELSE 0 END AS EightThirtyPM, 
                    CASE WHEN StartHours <= 21 AND EndHours >= 21 THEN 1 ELSE 0 END AS NinePM, 
                    CASE WHEN StartHours <= 21.5 AND EndHours >= 21.5 THEN 1 ELSE 0 END AS NineThirtyPM,
                    CASE WHEN StartHours <= 22 AND EndHours >= 22 THEN 1 ELSE 0 END AS TenPM, 
                    CASE WHEN StartHours <= 22.5 AND EndHours >= 22.5 THEN 1 ELSE 0 END AS TenThirtyPM,
                    CASE WHEN StartHours <= 23 AND EndHours >= 23 THEN 1 ELSE 0 END AS ElevenPM,
                    CASE WHEN StartHours <= 23.5 AND EndHours >= 23.5 THEN 1 ELSE 0 END AS ElevenThirtyPM
                FROM (
                        SELECT DisplayName, StartDate, EndDate, StartHours, EndHours
                        FROM (
                            SELECT DisplayName, 
                                CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) AS StartDate, 
                                DATEADD(hh, @prmOffSet, SL.SessionUTCStart) as Start,
                                CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) AS FLOAT)) AS DATETIME) AS EndDate, 
                                DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)) as [End],
                                DATEPART(hh, DATEADD(hh, @prmOffSet, SL.SessionUTCStart)) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, SL.SessionUTCStart))<30 THEN 0.0 ELSE 0.5 END AS StartHours, 
                                DATEPART(hh, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity))) + CASE WHEN DATEPART(mi, DATEADD(hh, @prmOffSet, ISNULL(SL.SessionUTCEnd,S.LastActivity)))<30 THEN 0.0 ELSE 0.5 END AS EndHours
                            FROM tbSessionLog SL LEFT OUTER JOIN tbSessions S ON SL.SessionID=S.SessionID
                            WHERE (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) >= CAST(@prmStartDate AS DATETIME)) AND 
                                  (CAST(FLOOR(CAST(DATEADD(hh, @prmOffSet, SL.SessionUTCStart) AS FLOAT)) AS DATETIME) <= CAST(@prmEndDate AS DATETIME))) AS Sess
                        GROUP BY DisplayName, StartDate, EndDate, StartHours, EndHours) AS DtlSess) AS HourCount
        GROUP BY StartDate
) T1
UNPIVOT
  (col FOR ListofColumns IN ([12:00AM],[12:30AM],[1:00AM],[1:30AM],[2:00AM],[2:30AM],[3:00AM],[3:30AM],[4:00AM],[4:30AM],[5:00AM],[5:30AM],[6:00AM],[6:30AM],[7:00AM],[7:30AM],[8:00AM],[8:30AM],[9:00AM],[9:30AM],[10:00AM],[10:30AM],[11:00AM],[11:30AM],[12:00PM],[12:30PM],[1:00PM],[1:30PM],[2:00PM],[2:30PM],[3:00PM],[3:30PM],[4:00PM],[4:30PM],[5:00PM],[5:30PM],[6:00PM],[6:30PM],[7:00PM],[7:30PM],[8:00PM],[8:30PM],[9:00PM],[9:30PM],[10:00PM],[10:30PM],[11:00PM],[11:30PM]))
    AS unpivott) as T2
Group by StartDate
于 2013-02-26T11:33:43.267 回答