在日SQL查询中选择指定时间段内的数据

在日SQL查询中选择指定时间段内的数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要在一天内的不同指定时间段内收到项目。像这样的输出; 有人知道我如何实现sql查询以返回这样的结果表吗,提前谢谢。您可以这样做: 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(DateTimeC

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

有人知道我如何实现sql查询以返回这样的结果表吗,提前谢谢。

您可以这样做:

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;
更新:

您可以将“透视表”操作符用于所有时间范围的临时表,如下所示:

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;
您可以这样做:

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;
更新:

您可以将“透视表”操作符用于所有时间范围的临时表,如下所示:

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很抱歉介于之间,然后忘记修复它,thanksAlso between包含在内,因此您将计数10小时两次等。因此,您的9个示例行生成的结果为12。@MartinSmith-非常感谢我现在修复了它,但是如何在PIVOT表操作符中写入它是可能的??是的,您需要添加一个计算列,其中包含与时间相关的“bucket”,然后在该列上进行PIVOT。PIVOT我们可以将这些值写入临时表中。对吗?@MartinSmith抱歉是介于之间,然后忘了修复它,thanksAlso between包含在内,因此您将计数10小时两次等等。因此您的9个示例行产生12的结果。@MartinSmith-非常感谢我现在修复了它,但如何在PIVOT表运算符中写入这一点是可能的?是的,您需要添加一个计算列,其中包含与时间相关的“bucket”,然后对该列进行透视。透视我们可以通过将这些值放入临时表来写入。正当