sql - 按小时显示“打开”记录数的数据透视表
问题描述
我实际上有一个包含两个重要字段的表。ReadyDate 和 CompleteDate。
我希望我的输出给我 24 列,对应于一天中的一个小时,每列给我仍然“打开”的记录数(定义为一小时结束前的 ReadyDate 但一小时结束后的 CompleteDate)在那个时钟时间。
所以诀窍是一条记录可以出现在零列或多列中。上午 6:05 的 ReadyDate 和上午 9:17 的 CompleteDate 将出现在 6:00a、7:00a 和 8:00a 列上。
所以如果表有以下条目
10-14-2019 06:05 10-14-2019 06:10 (this will populate no columns)
10-14-2019 07:12 10-14-2019 09:30 (this will populate the 7:00 hour and 8:00 hour)
10-14-2019 10:02 10-14-2019 13:55 (this will populate the 10:00 hour, 11:00, 12:00)
10-14-2019 12:50 10-14-2019 15:30 (this will populate the 12:00, 13:00, 14:00)
我希望我的输出有 24 列,其中包含以下数字 0、0、0、0、0、0、0、1、1、0、1、1、2、1、1、0、0、0、 0, 0, 0, 0, 0,0
我不知道如何进行。任何见解将不胜感激
解决方案
编辑更正了 1 小时的班次
这是一个使用临时计数表的 PIVOT 选项。
计入午夜翻车。
不清楚您是否想要按日期排列。如果没有,删除将是一件小事。
例子
;with cte1 as (
Select Date = convert(date,D)
,Item = datepart(hour,D)
,Value = 1
From YourTable A
Cross Apply (
Select Top (DateDiff(HOUR,ReadyDate,CompleteDate)+0)
D=DateAdd(HOUR,-1+Row_Number() Over (Order By (Select Null)),ReadyDate)
From master..spt_values n1,master..spt_values n2
) B
), cte2 as (
Select Date
,B.Item
,B.Value
From (Select distinct Date from cte1 ) a
Cross Join (Select Top 24 Item=-1+Row_Number() Over (Order By (Select NULL)),Value=0 From master..spt_values n1 ) B
)
Select *
From (Select * from cte1
Union All
Select * from cte2
) src
Pivot (sum(Value) for Item in ([0] ,[1] ,[2] ,[3] ,[4] ,[5] ,[6] ,[7] ,[8] ,[9] ,[10],[11],
[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23]) ) pvt
退货
推荐阅读
- spring - Spring Boot 和 Spring Data with Cassandra:在数据库连接失败时继续
- c# - 是否可以使用实体框架从 C# 中的多个表中获取连接 SQL 查询的结果?
- sql - 更新用于 SQL 报告的表中的批量数据的最佳实践
- git - 在 git 中,我如何验证错误修复是否在 Release 分支和 master 中
- php - 连接并搜索数据库,然后将其显示到网页?
- c# - System.Windows.Forms.dll 中抛出空引用异常
- python - Python - 创建多个列表并压缩
- javascript - 我如何将我的按钮放在 img 的中心?
- sql - 是否可以将 SUM() ORDER BY 的结果放入原始表中?
- android - 当android应用程序运行很长时间时,操作系统是否会杀死UI?