每小时的SQL Pivot表

时间:2013-05-14 17:08:05

标签: sql pivot

我的表格如下

Prefix scandate
A      1/2/2013 08:30
A      1/2/2013 08:45
B      1/2/2103 09:15

我需要每小时计数输出i,e

Time             A          B
08:30-09:30      2          0
09:30-10-30      0          1

直到晚上7点

有人可以帮助我

2 个答案:

答案 0 :(得分:0)

根据您使用的数据库,这样的内容应该有效:

SELECT
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 1 THEN 1 ELSE 0 END) As '00:30 - 01:30 Block'
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 2 THEN 1 ELSE 0 END) As '01:30 - 02:30 Block'
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 3 THEN 1 ELSE 0 END) As '02:30 - 03:30 Block'
...
FROM table

您只需要将小时部分标识符迭代到晚上7点,即1,2,... 19。警告,这在12:30 AM之前的任何时候都不会有效。

答案 1 :(得分:0)

在MySQL中你可以这样做:

SELECT 
 CONCAT(
  HOUR(SUBTIME(scandate, '00:30:00')), ':30', 
  '-',
  HOUR(ADDTIME(scandate, '00:30:00')), ':30') AS time, 
 SUM(IF(prefix = 'A', 1, 0)) AS A, 
 SUM(IF(prefix = 'B', 1, 0)) AS B 
FROM tableName 
WHERE TIME(scandate) <= '19:00:00' 
GROUP BY HOUR(SUBTIME(scandate, '00:30:00'));

注意:

  • 查询必须具有这些 sub 添加次,因此08:30-09:30之类的时间间隔将更改为08:00-09:00并且将具有普通时间(正好是09:00,小时是09,而不是08)。

  • 我只尝试使用日期时间函数来达到输出中time列的预期值,但我只能使用CONCAT来达到它。

  • 如果您对列prefix(“A”和“B”以外的其他值)有其他值,则必须改进查询,添加更多SUM(IF(prefix = 'A', 1, 0)) AS A,更改字符和列别名达到预期值。

希望它适合你!

修改

根据@bluefeet评论,您可以根据您的RDBMS更改此查询,其中包含与以下结果相同的确切命令:

  • CONCAT:连接两个或多个字符串;
  • HOUR:从日期时间(或时间)中提取“小时”部分;
  • TIME:从日期时间中提取“时间”部分;
  • SUBTIME:减去两次;
  • ADDTIME:sum(add)两次;
预计

SUMIF在几乎所有RDBMS中的工作方式都相同,以及查询的基本结构(SELECTFROM,{{ 1}},WHERE)。