tsql枢轴函数
需要有关以下查询的帮助: 当前数据格式:tsql枢轴函数,tsql,Tsql,需要有关以下查询的帮助: 当前数据格式: StudentID EnrolledStartTime EnrolledEndTime 1 7/18/2011 1.00 AM 7/18/2011 1.05 AM 2 7/18/2011 1.00 AM 7/18/2011 1.09 AM 3 7/18/2011 1.20 AM 7/18/201
StudentID EnrolledStartTime EnrolledEndTime
1 7/18/2011 1.00 AM 7/18/2011 1.05 AM
2 7/18/2011 1.00 AM 7/18/2011 1.09 AM
3 7/18/2011 1.20 AM 7/18/2011 1.40 AM
4 7/18/2011 1.50 AM 7/18/2011 1.59 AM
5 7/19/2011 1.00 AM 7/19/2011 1.05 AM
6 7/19/2011 1.00 AM 7/19/2011 1.09 AM
7 7/19/2011 1.20 AM 7/19/2011 1.40 AM
8 7/19/2011 1.10 AM 7/18/2011 1.59 AM
我想计算EnrolledTime和EnrolledStartTime之间的时间差,并将其与15分钟的时间差和该时间内注册的学生数进行分组
预期结果:
Count(StudentID) Date 0-15Mins 16-30Mins 31-45Mins 46-60Mins
4 7/18/2011 3 1 0 0
4 7/19/2011 2 1 0 1
我是否可以使用PIVOT函数的组合来获得所需的结果。任何指针都会有帮助。创建一个表变量/temp表,其中包括原始表中的所有列,以及一个将行标记为0、16、31或46的列。然后 从临时表名PIVOT CountStudentID中选择*作为0、16、31、46中的新列名
那会让你很接近 您可以在此处查看基本的透视说明:,但使用透视时会遇到的一个问题是,您需要提前知道要透视到哪些列 例如,你提到了0-15、16-30等,但实际上,你不知道有些学生可能需要多长时间——有些可能需要24小时,或者你的整个课时超时,或者你做了什么 所以为了缓解这个问题,我建议用最后一列作为总括,标记为“>60” 除此之外,只需在此表上进行选择,选择学生ID、日期和案例语句,就可以获得处理pivot所需的所有内容
CASE WHEN date2 - date1 < 15 THEN '0-15' WHEN date2-date1 < 30 THEN '16-30'...ELSE '>60' END.
我有一个不支持pivot的旧版本ms sql server。我编写了获取数据的sql。我无法测试枢轴,所以我尽了最大努力,无法测试枢轴部分。sql的其余部分将为您提供数据透视表的确切数据。如果接受null而不是0,则可以编写得更简单,可以跳过中定义的a subselect部分,并使用
declare @t table (EnrolledStartTime datetime,EnrolledEndTime datetime)
insert @t values('2011/7/18 01:00', '2011/7/18 01:05')
insert @t values('2011/7/18 01:00', '2011/7/18 01:09')
insert @t values('2011/7/18 01:20', '2011/7/18 01:40')
insert @t values('2011/7/18 01:50', '2011/7/18 01:59')
insert @t values('2011/7/19 01:00', '2011/7/19 01:05')
insert @t values('2011/7/19 01:00', '2011/7/19 01:09')
insert @t values('2011/7/19 01:20', '2011/7/19 01:40')
insert @t values('2011/7/19 01:10', '2011/7/19 01:59')
;with a
as
(select * from
(select distinct dateadd(day, cast(EnrolledStartTime as int), 0) date from @t) dates
cross join
(select '0-15Mins' t, 0 group1 union select '16-30Mins', 1 union select '31-45Mins', 2 union select '46-60Mins', 3) i)
, b as
(select (datediff(minute, EnrolledStartTime, EnrolledEndTime )-1)/15 group1, dateadd(day, cast(EnrolledStartTime as int), 0) date
from @t)
select count(b.date) count, a.date, a.t, a.group1 from a
left join b
on a.group1 = b.group1
and a.date = b.date
group by a.date, a.t, a.group1
-- PIVOT(max(date)
-- FOR group1
-- in(['0-15Mins'], ['16-30Mins'], ['31-45Mins'], ['46-60Mins'])AS p