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