日期的行列转换

来源:互联网 发布:js ide工具 编辑:程序博客网 时间:2024/05/16 13:42

原表如下:
姓名 班次 日期
小王 白班 2010-05-26
小王 白班 2010-05-27
小王 白班 2010-05-28
小王 白班 2010-05-29
小王 白班 2010-05-30
小王 白班 2010-05-31
小王 白班 2010-06-01
小王 白班 2010-06-02
小王 白班 2010-06-03



需要实现内容:


姓名 起始日期 星期一 星期二 星期三 星期四 星期五 星期六 星期日
小王 2010-05-24 白班 白班 白班 白班 白班
小王 2010-05-31 白班 白班 白班 白班 白班 。。。

--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (姓名 varchar(4),班次 varchar(4),日期 datetime)
insert into [tb]
select '小王','白班','2010-05-26' union all
select '小王','白班','2010-05-27' union all
select '小王','白班','2010-05-28' union all
select '小王','白班','2010-05-29' union all
select '小王','白班','2010-05-30' union all
select '小王','白班','2010-05-31' union all
select '小王','白班','2010-06-01' union all
select '小王','白班','2010-06-02' union all
select '小王','白班','2010-06-03'
go



set datefirst 1
select 姓名,起始日期,星期一=max(case datename(dw,日期) when '星期一' then 班次 else null end),
星期二
=max(case datename(dw,日期) when '星期二' then 班次 else null end),
星期三
=max(case datename(dw,日期) when '星期三' then 班次 else null end),
星期四
=max(case datename(dw,日期) when '星期四' then 班次 else null end),
星期五
=max(case datename(dw,日期) when '星期五' then 班次 else null end),
星期六
=max(case datename(dw,日期) when '星期六' then 班次 else null end),
星期七
=max(case datename(dw,日期) when '星期七' then 班次 else null end)
from (select *,起始日期=dateadd(dd,1-datepart(dw,日期),日期) from tb)a
group by 姓名,起始日期


--结果:
姓名   起始日期                    星期一  星期二  星期三  星期四  星期五  星期六  星期七
---- ----------------------- ---- ---- ---- ---- ---- ---- ----
小王   2010-05-24 00:00:00.000 NULL NULL 白班   白班   白班   白班   NULL
小王  
2010-05-31 00:00:00.000 白班   白班   白班   白班   NULL NULL NULL