我有一张看起来像这样的表:
ID ScheduledPickUpTime PickUpTime ScheduledDropTime DropTime
-- -------------------- ---------- ----------------- --------
1 00:10 00:30 03:10 03:30
2 01:10 02:10 03:05 03:10
3 02:30 02:45 05:20 07:00
4 08:00 08:45 13:00 14:00
5 11:20 12:00 20:00 21:00
我需要以下面的格式显示信息,时间跨度从上午12点到下午12点,每次字段列都按时间跨度计算。
TimeData 00:00-01:00 01:00-02:00 02:00-03:00 03:00-04:00 ....
ScheduledPickUpTime 1 1 1 0
PickUpTime 1 0 2 0
ScheduledDropTime 0 0 0 2
DropTime 0 0 0 2
我需要帮助创建执行此操作的sql查询。提前谢谢。
更新
该表有一个额外的EventType列。此列需要不显示,每个EventType的计数基于PickUpTime列
ID ScheduledPickUpTime PickUpTime ScheduledDropTime DropTime EventType
-- -------------------- ---------- ----------------- --------
1 00:10 00:30 03:10 03:30 Call
2 01:10 02:10 03:05 03:10 Email
3 02:30 02:45 05:20 07:00 Email
4 08:00 08:45 13:00 14:00 Call
5 11:20 12:00 20:00 21:00 Routine
这种情况下的输出应为
TimeData 00:00-01:00 01:00-02:00 02:00-03:00 03:00-04:00 ....
ScheduledPickUpTime 1 1 1 0
PickUpTime 1 0 2 0
ScheduledDropTime 0 0 0 2
DropTime 0 0 0 2
Call 1 0 0 0
Email 0 0 2 0
Routine 0 0 0 0
EventType列中的值是动态的,可以有更多这样的变化。
有可能实现这一目标吗?谢谢!
答案 0 :(得分:1)
这很复杂。它是一个支点和一个非透视:
select TimeData,
sum(case when t >= '00:00' and t < '01:00' then 1 else 0 end) as [00:00-01:00],
sum(case when t >= '01:00' and t < '02:00' then 1 else 0 end) as [01:00-02:00],
sum(case when t >= '02:00' and t < '03:00' then 1 else 0 end) as [02:00-03:00],
. . .
from t apply
(values ('ScheduledPickUpTime', ScheduledPickUpTime, 1),
('PickUpTime', PickUpTime, 2),
('ScheduledDropTime', ScheduledDropTime, 3),
('DropTime', DropTime, 4)
) v(TimeData, t, ordering)
group by TimeData, ordering
order by ordering;