SQL数据透视表
问题描述:
我有表如下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点
有人能帮助我
答
根据你使用的数据库,这样的东西应该工作:
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之前运行。
答
在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
:总和(加)两次;
SUM
和IF
预计将在几乎所有的RDBMS同样的方式,以及查询(SELECT
,FROM
,WHERE
,GROUP BY
)的基本结构。
我只是回答了这个为oracle和天“http://*.com/questions/16534615/creating-date-variable-to-get-multiple-counts-of-a-given-variable/16534656#16534656 – Hogan 2013-05-14 17:29:43
欢迎来到Stack Overflow!请通过添加适当的标记(Oracle,SQL Server,MySQL等)来指定您要定位的RDBMS。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答的人的关注。 – Taryn 2013-05-14 20:42:12