首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

自动生成起始日期列,按日期位置显示任务

2012-04-19 
求教:自动生成起始日期列,按日期位置显示任务1)项目计划包括1)开始日期,2)结束日期,3)人员,4)任务描述2012

求教:自动生成起始日期列,按日期位置显示任务
1)项目计划包括1)开始日期,2)结束日期,3)人员,4)任务描述
2012-04-01 2012-04-6 甲 任务1
2012-04-02 2012-04-11 乙 任务2
2012-04-7 2012-04-10 甲 任务3
2012-04-01 2012-04-3 丙 任务4

2)请问如何获得:
       甲   乙   丙
2012-04-01 任务1    任务4  
2012-04-02    任务3  
2012-04-03
2012-04-04
2012-04-05
2012-04-06
2012-04-07 任务2
2012-04-08
2012-04-09
2012-04-10
2012-04-11



[解决办法]
with t(开始时间,结束时间,人员,任务描述) as (
select CAST('2012-04-01' as DATE), CAST('2012-04-06' as DATE), '甲', '任务1'
union all select CAST('2012-04-02' as DATE), CAST('2012-04-11' as DATE), '乙', '任务2'
union all select CAST('2012-04-07' as DATE), CAST('2012-04-10' as DATE), '甲', '任务3'
union all select CAST('2012-04-01' as DATE), CAST('2012-04-03' as DATE), '丙', '任务4'
)
,t1 as (select 开始时间 D from t union select 结束时间 from t)
,t2 as (select MIN(D) minD,Max(D) maxD from t1)
,diffD as( select number
from master..spt_values where type='P' and number between 0 
and (select DATEDIFF(DD,minD,maxD) from t2)
),dates as (
select cast(DATEADD(dd,number,(select minD from t2)) as DATE) as [date] 
from diffD
), src as (
select [date],人员,任务描述
from dates d
left join t on d.[date]=t.开始时间)
select * from src
pivot(max(任务描述) for 人员 in ([甲],[乙],[丙])) pvt

[解决办法]

SQL code
create table 项目计划(开始日期 date,结束日期 date,人员 varchar(4),任务描述 varchar(8))insert into 项目计划select '2012-04-01', '2012-04-6', '甲', '任务1' union allselect '2012-04-02', '2012-04-11', '乙', '任务2' union allselect '2012-04-07', '2012-04-10', '甲', '任务3' union allselect '2012-04-01', '2012-04-3', '丙', '任务4'declare @sql varchar(6000),@pl varchar(2000)select @pl=stuff((select ',isnull(['+人员+'],'''') ['+人员+']' from(select distinct 人员 from 项目计划) torder by case 人员 when '甲' then 1  when '乙' then 2when '丙' then 3 endfor xml path('')),1,1,'')select @sql='with t1 as(select min(开始日期) mb,        datediff(d,min(开始日期),max(结束日期)) ds  from 项目计划),t2 as(select dateadd(d,b.number,t1.mb) dlfrom t1inner join master.dbo.spt_values bon b.[type]=''P'' and b.number<=t1.ds),t3 as(select 开始日期,'+@pl+'from (select 开始日期,人员,任务描述 from 项目计划) apivot(max(任务描述) for 人员 in([甲],[乙],[丙])) t)select t2.dl ''开始日期'','+@pl+'from t2left join t3 on t2.dl=t3.开始日期'exec(@sql)开始日期       甲        乙        丙---------- -------- -------- --------2012-04-01 任务1               任务42012-04-02          任务2      2012-04-03                   2012-04-04                   2012-04-05                   2012-04-06                   2012-04-07 任务3               2012-04-08                   2012-04-09                   2012-04-10                   2012-04-11                   (11 row(s) affected) 

热点排行