选择一天中指定时间段内的数据 SQL Query
Posted
技术标签:
【中文标题】选择一天中指定时间段内的数据 SQL Query【英文标题】:Select data within specified time periods in a day SQL Query 【发布时间】:2017-10-15 17:43:36 【问题描述】:我需要在一天内的不同指定时间段内收到物品。像这样的输出;
有谁知道我如何实现一个 sql 查询来返回这样的结果表,在此先感谢。
【问题讨论】:
显示一些示例数据和您的尝试。 【参考方案1】:你可以这样做:
SELECT Item,
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '08:00:00' AND CAST(DateTimeCol AS Time) < '10:00:00' THEN 1 ELSE 0 END) AS [8AM-10AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '10:00:00' AND CAST(DateTimeCol AS Time) < '12:00:00' THEN 1 ELSE 0 END) AS [8AM-10AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '12:00:00' AND CAST(DateTimeCol AS Time) < '14:00:00' THEN 1 ELSE 0 END) AS [10AM-12AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '14:00:00' AND CAST(DateTimeCol AS Time) < '16:00:00' THEN 1 ELSE 0 END) AS [12PM-2PM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '16:00:00' THEN 1 ELSE 0 END) AS [>4PM]
FROM table1
GROUP BY Item;
Demo
示例结果:
| Item | 8AM-10AM | 10AM-12AM | 12PM-2PM | 2AM-4PM | >4PM |
|--------|----------|-----------|----------|---------|------|
| Item 1 | 2 | 4 | 1 | 0 | 0 |
| Item 2 | 0 | 0 | 1 | 2 | 2 |
更新:
您可以将PIVOT
表运算符与临时表一起使用,所有时间范围如下:
SELECT *
FROM
(
SELECT
Item,
Alias
FROM Table1
INNER JOIN Ranges ON CAST(DateTimeCol AS TIME) >= [Start]
AND CAST(DateTimeCol AS TIME) < [End]
) AS t
PIVOT
(
COUNT(Alias)
FOR Alias IN([8AM-10AM], [10AM-12AM], [12PM-2PM],[2PM-4PM], [>4PM])
) AS p;
pivot demo
【讨论】:
@MartinSmith 抱歉,原来是between
,然后忘记修复了,谢谢
还 BETWEEN
包含在内,因此您将计算 10 小时两次等。因此您的 9 个示例行产生的结果为 12。
@MartinSmith - 非常感谢我现在修复了它,但是这怎么可能写在PIVOT
表运算符中??
是的,您需要添加一个计算列,其中包含与时间相关的“桶”,然后以此为中心。
PIVOT 我们可以通过将这些值放入临时表中来编写。对吗?以上是关于选择一天中指定时间段内的数据 SQL Query的主要内容,如果未能解决你的问题,请参考以下文章
通过 * 选择所有列和在 SQL 查询中指定所有列名来检索数据有啥区别? [复制]
SQL 中删除语法的问题 - 当子查询没有与 EXISTS 一起引入时,错误只能在选择列表中指定一个表达式