2015-09-07 322 views
0

我有一个结果集,它由一个日期字段和值列组成。SQL Server:按日期字段分组,按时间和日期排序

日期列可以是从周,月,几个月到几年的范围。格式为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) 

正如你所见。我需要结果按小时分组。然后按电台的开始时间排序,也按月份的日期排序。

编辑:

enter image description here

如上所述,用于查询的最终结果。

将是它的月回报小时插槽,从定义的“起始时间”开始,相对天(S)(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 

编辑设置

enter image description here

这就是我想实现与查询什么。顶部的时间,左边的一天。数据在中间。

+2

1日起有没有显示格式。](http://stackoverflow.com/questions/30032915/how-to-cast-the-datetime-to-time/30033028#30033028)2.请编辑您的问题,包括一些示例数据(最好是ddl + dml)和所需的输出。 –

+0

@Zohar感谢您的输入。我已根据要求进行了修改。 – dannyb2100

回答

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