2013-05-14 157 views
0

我有表如下SQL数据透视表

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

我需要在每一个时刻,我与计数输出,E

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

直到晚上7点

有人能帮助我

+0

我只是回答了这个为oracle和天“http://stackoverflow.com/questions/16534615/creating-date-variable-to-get-multiple-counts-of-a-given-variable/16534656#16534656 – Hogan 2013-05-14 17:29:43

+1

欢迎来到Stack Overflow!请通过添加适当的标记(Oracle,SQL Server,MySQL等)来指定您要定位的RDBMS。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答的人的关注。 – Taryn 2013-05-14 20:42:12

回答

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之前运行。

+0

哇,多么可怕的解决方案 – Hogan 2013-05-14 18:28:52

+1

错误地使用了COUNT而不是SUM。偶尔Hogan你可以提供一个改进的答案? – 2013-05-14 18:54:33

+0

是看到评论中的链接。 – Hogan 2013-05-15 10:14:39

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')); 

注:

  • 查询必须具有以下添加倍,所以像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,将字符和列别名更改为期望值。

希望它适合你!

  • CONCAT

    编辑

    基于@bluefeet评论,你可以根据与达到相同的结果准确命令你的RDBMS更改此查询连接两个或多个字符串;

  • HOUR:从日期时间(或时间)中提取“小时”部分;
  • TIME:从日期时间提取“时间”部分;
  • SUBTIME:减去两次;
  • ADDTIME:总和(加)两次;

SUMIF预计将在几乎所有的RDBMS同样的方式,以及查询(SELECTFROMWHEREGROUP BY)的基本结构。