【问题标题】:Select data within specified time periods in a day SQL Query选择一天中指定时间段内的数据 SQL Query
【发布时间】:2017-10-15 17:43:36
【问题描述】:

我需要在一天内的不同指定时间段内收到物品。像这样的输出;

有谁知道我如何实现一个 sql 查询来返回这样的结果表,在此先感谢。

【问题讨论】:

  • 显示一些示例数据和您的尝试。

标签: sql sql-server sql-server-2008


【解决方案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;

示例结果

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

【讨论】:

  • @MartinSmith 抱歉,原来是between,然后忘记修复了,谢谢
  • BETWEEN 包含在内,因此您将计算 10 小时两次等。因此您的 9 个示例行产生的结果为 12。
  • @MartinSmith - 非常感谢我现在修复了它,但是这怎么可能写在PIVOT 表运算符中??
  • 是的,您需要添加一个计算列,其中包含与时间相关的“桶”,然后以此为中心。
  • PIVOT 我们可以通过将这些值放入临时表中来编写。对吗?
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2017-07-31
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多