Sql 从表创建花名册
我有原始表,其中包含以下格式的原始数据:Sql 从表创建花名册,sql,tsql,sql-server-2005,Sql,Tsql,Sql Server 2005,我有原始表,其中包含以下格式的原始数据: gkey Start_date Finish_date Start_Hr Finish_hr Name 1 2014-01-01 2014-10-16 07 15 Smith 2 2014-01-01 2014-12-31 15 21 Johnes 3 2014-01-01 2014-12-31 21 07 A
gkey Start_date Finish_date Start_Hr Finish_hr Name
1 2014-01-01 2014-10-16 07 15 Smith
2 2014-01-01 2014-12-31 15 21 Johnes
3 2014-01-01 2014-12-31 21 07 Adams
4 2014-10-16 2014-12-31 21 07 Doe
...
我想以每周花名册的形式展示
Shift today today+1 today+2 today+3....
Morning Smith Smith Doe
Afternoon Johnes Johnes Johnes
Evening .....
我先把它放在一张漂亮的虚拟桌子上
declare @d datetime
declare @c integer
declare @T table (
[day] datetime,
name varchar(max),
shift varchar(max)
)
set @c=1
set @d= getdate();
while @c<=7
begin
insert into @T
select @d as [day],
name,
case when finish_hr <=6 then 'Morning' when finish_hr<=15 then 'Afternoon' when finish_hr<=23 then 'Evening' end as shift
from calling_roster where start_date <=@d and finish_date >@d
set @c= @c+1
set @d = dateadd(day,1,@d)
end
现在我被卡住了…这可以通过PIVOT查询来完成 在这里,我将您的日期划分为一周中的几天:
SELECT [name], [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday]
FROM (
SELECT [name], DATENAME(dw, [day]) AS DayWeek, [shift]
FROM table1
) AS src
pivot (
max([shift]) FOR DayWeek IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday])
) AS pvt
您可以在Google“sql server pivot”中看到它的工作原理。您的下一步可能是将日期限制为比今天大的日期,然后您将只看到影响您一周的日期。如果您想使您的日期具有动态性,您需要基于当前日期生成动态sql并执行它。谢谢,我知道我必须摆弄pivot命令,但我不懂它的窍门
SELECT [name], [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday]
FROM (
SELECT [name], DATENAME(dw, [day]) AS DayWeek, [shift]
FROM table1
) AS src
pivot (
max([shift]) FOR DayWeek IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday])
) AS pvt