2011-07-18 67 views
1

需要用下面的查詢有助於TSQL PIVOT功能

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 

我想計算15分鐘差和計數EnrolledEndTime和EnrolledStartTime和組它之間的時間差當時入學的學生。

預期結果:

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 

我可以使用旋轉功能的組合acheive所需的結果。任何指針都會有幫助。

回答

0

創建包含所有從原始表中的列,以及一列標誌着行爲0,16,31或46然後

SELECT * FROM 臨時表名表變量/臨時表。在(0,16,31,46)PIVOT(計數(StudentID)FOR 新列名

這應該讓你非常接近

0

這是可能的(只是看到基本的支點說明操作:http://msdn.microsoft.com/en-us/library/ms177410.aspx ),但你有一個問題我有使用數據透視表,你需要提前知道你想要透視哪些列。

例如,你提到0-15,16-30,等等,但實際上,你不知道有些學生可能需要多長時間 - 有些人可能需要24小時,或完全會話超時,或者你有什麼。

所以爲了緩解這個問題,我建議有一個最後一列作爲一個總括,標記爲'> 60'。

除此之外,只需在該表格上進行選擇,選擇學號,日期和CASE語句,就可以掌握所需的所有工作。

CASE WHEN date2 - date1 < 15 THEN '0-15' WHEN date2-date1 < 30 THEN '16-30'...ELSE '>60' END. 
0

我有一箇舊版本的ms sql服務器,不支持數據透視。我編寫了用於獲取數據的sql。我無法測試數據透視,所以我盡我所能,無法測試數據透視部分。其餘的sql將爲您提供數據透視表的確切數據。如果你接受null而不是0,它可以寫得更簡單,你可以跳過「with a ...」中定義的「子選擇」部分。

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