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