我有一个结果集,它包含一个datefield和value列。
日期列可以是从周,月,几个月到几年的范围。格式为YYYY-mm-dd hh:mm:ss.ssss(2015-03-01 00:00:00.000)
值列是一个简单的小数。
我无法按照我想要的方式对结果进行分组。
从下面的查询中,您可以看到我想要实现的目标。 我从结果集中选择,相对月份,小时图,日期和价值。
SELECT
CONVERT(VARCHAR(2), datefield, 108) AS hourSlot,
SUM(value) AS hourTotal,
DATEPART(day,datefield) as day,
CASE CONVERT(VARCHAR(2), datefield, 108)
WHEN @stationStartTime
THEN 1
ELSE 0
END AS sortOrder
FROM
@hourTotalTemp
WHERE
DATEPART(MM, datefield) = 3
GROUP BY
DATEPART(day,datefield)
ORDER BY
day, sortOrder, CONVERT(VARCHAR(2), datefield, 108)
你可能会看到。
我需要将结果按小时分组。然后按电台的开始时间排序,也可以按月的日期排序。
修改
如上所述,查询的最终结果。
将从定义的"开始时间"开始返回小时位置,该月的相对日期(1,2,3,4,5,6,7th)等),然后是那些日子的价值。
@hourtotalTemp
datefield value
------------------------------
2015-02-01 00:00:00.000 0
2015-02-01 01:00:00.000 0
2015-02-01 02:00:00.000 0
2015-02-01 03:00:00.000 0
2015-02-01 04:00:00.000 0
2015-02-01 05:00:00.000 0
修改
这是我想用查询实现的。顶部的小时,左边的一天。而数据在中间。
答案 0 :(得分:0)
为什么不在子查询中进行分组,然后只对外部查询进行排序?像这样......
SELECT *
from (select CONVERT(VARCHAR(2), datefield, 108) AS hourSlot,
SUM(value) AS hourTotal,
DATEPART(day,datefield) as day,
CASE CONVERT(VARCHAR(2), datefield, 108)
WHEN @stationStartTime
THEN 1
ELSE 0
END AS sortOrder
FROM @hourTotalTemp
WHERE DATEPART(MM, datefield) = 3
GROUP BY DATEPART(day,datefield) ) tbl
ORDER BY day, sortOrder, hourslot
答案 1 :(得分:0)
这将为您提供“四舍五入到小时”日期字段:
dateadd(hour,datediff(hour,0,field),0)
您可以使用此按钮进行分组和排序。如果您在子查询中使用它通常会更容易,因为结果是日期字段,例如
SELECT
-- all the stuff you need using hour_date_field
FROM
(SELECT *,
dateadd(hour,datediff(hour,0,datefield),0) as hour_date_field) X
FROM table) X
WHERE DATEPART(MM, hour_date_field) = 3
GROUP BY hour_date_field
ORDER BY hour_date_field
帽子提示/更多信息 - 这个问题(和答案):Floor a date in SQL server