SQL / Excel:使每小时SQL条目的Excel表

我有一个移动一些SQL查询到Excel的问题。 所以我现在有一个这样的表(我从SQL获得):

Date | Name -------------------------- 2016-08-09 06:05:22 | Jeff 2016-08-09 06:08:42 | Jeff 2016-08-09 06:43:16 | Jeff 2016-08-09 07:05:22 | Jeff 2016-08-09 07:33:04 | Alex 2016-08-09 09:33:54 | Alex 2016-08-09 10:45:02 | Sara 

而我要做的是build立一个Excel表格显示,每小时分隔,每个人的名字出现多less次。 所以在6点钟的时候,我希望在Jeff旁边有一个3,其他的都是0。 在7我想要杰夫1和亚历克斯1。 而在9日和10日,我要分别为Alex和1个Sara。

以下是我想要的样子:

  | 06 | 07 | 08 | 09 | 10 | 11 ---------------------------------- Jeff | 3 | 1 | 0 | 0 | 0 | 0 Alex | 0 | 1 | 0 | 1 | 0 | 0 Sara | 0 | 0 | 0 | 0 | 1 | 0 

下面是在SQL中得到这个结果的一个快速和肮脏的方法:

 SELECT name, COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 0 THEN 1 END) AS [00], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 1 THEN 1 END) AS [01], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 2 THEN 1 END) AS [02], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 3 THEN 1 END) AS [03], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 4 THEN 1 END) AS [04], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 5 THEN 1 END) AS [05], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 6 THEN 1 END) AS [06], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 7 THEN 1 END) AS [07], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 8 THEN 1 END) AS [08], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 9 THEN 1 END) AS [09], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 10 THEN 1 END) AS [10], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 11 THEN 1 END) AS [11], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 12 THEN 1 END) AS [12], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 13 THEN 1 END) AS [13], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 14 THEN 1 END) AS [14], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 15 THEN 1 END) AS [15], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 16 THEN 1 END) AS [16], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 17 THEN 1 END) AS [17], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 18 THEN 1 END) AS [18], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 19 THEN 1 END) AS [19], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 20 THEN 1 END) AS [20], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 21 THEN 1 END) AS [21], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 22 THEN 1 END) AS [22], COUNT(CASE WHEN DATEPART(HOUR,[Date]) = 23 THEN 1 END) AS [23] FROM mytable -- Replace with the name of your table GROUP BY name 

如果个人( name )在该小时内有logging,这将为每个小时创build一个列。


这里使用的是PIVOT语法:

 WITH mycte AS ( -- To make sure that hours with no individuals (`name`), we full join to all possible hours (0-23) SELECT hr.hour_number, mt.name, mt.[Date] FROM ( 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) ) hr (hour_number) FULL JOIN mytable mt ON (hr.hour_number = DATEPART(HOUR,mt.datet)) GROUP BY hr.hour_number, mt.name, mt.[Date] ) -- This is the actual pivot. Had we not done the work above, hours were the value was 0 for all `name`s would not appear SELECT name, [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12], [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23] FROM mycte PIVOT ( COUNT([Date]) FOR hour_number IN ( [0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12], [13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23] ) ) p WHERE name IS NOT NULL -- This ensure only records associated to a name is returned 

一个选项是提取时间元素:

 =INT(MOD(A2,1)*24) 

复制下来以适应。

这需要date/时间的时间元素,将其转换为小时和四舍五入。

然后枢纽:

SO38885347的例子

要确保完整的时间(例如,包括8 ),您需要添加那些丢失到您的源数据。

有一个选项可以显示0而不是空白,如果你想要的话。

名称的顺序默认是按字母顺序的,但可以手动调整。