日期:2014-05-17  浏览次数:20512 次

行列转换后,如何加上求和列?????


--> --> (Roy)生成測試數據
 
if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[name] nvarchar(2),[status] nvarchar(2),[workday] Datetime)
Insert #T
select 1001,N'张三',N'上班','2011-11-10' union all
select 1002,N'李四',N'上班','2011-11-10' union all
select 1003,N'王五',N'上班','2011-11-10' union all
select 1004,N'张三',N'上班','2011-11-11' union all
select 1005,N'李四',N'请假','2011-11-11' union all
select 1006,N'王五',N'上班','2011-11-11'
Go
declare @dt1 datetime,@dt2 datetime,@dt3 datetime
set @dt1='2011-11-25'
set @dt2=dateadd(m,-1,@dt1)+1
set @dt3=@dt2

declare @s nvarchar(4000)
set @s=''
while @dt1>=@dt2
Select   @s=@s+N','+quotename(rtrim(Day(@dt2))+'号')+N'=max(case when Day([workday])=N'+quotename(Day(@dt2),'''')+N' then [status]  end)',@dt2=@dt2+1

--顯示生成語句
print N'select [name]'+@s+N' from #T where [workday] between '''+convert(varchar(10),@dt3,120)+''' and '''+convert(varchar(10),@dt1,120)+'''  group by [name]'

exec(N'select [name]'+@s+N' from #T where [workday] between '''+@dt3+''' and '''+@dt1+''' group by [name]')


/*
name 26号 27号 28号 29号 30号 31号 1号 2号 3号 4号 5号 6号 7号 8号 9号 10号 11号 12号 13号 14号 15号 16号 17号 18号 19号 20号 21号 22号 23号 24号 25号
李四 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 上班 请假 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
王五 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 上班 上班 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
张三 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 上班 上班 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
*/


这个是我当时有个需求,然后问高手的一个设计,现在业务需求发生变化,需要在最后的一列中加一个上班的总天数,请问有没有什么好的方法求出这个count(上班)?
类似于




/*
   11号    12号    13号    15号    16号    17号    ...   23号    24号    25号 总上班天数
    上班    请假    NULL   NULL    NULL    NULL   ...   NULL    NULL    NULL   1
    上班    上班    NULL   NULL    NULL    NULL   ...   NULL    NULL    NULL   2
    上班    上班    NULL   NULL    NULL    NULL   ...   NULL    NULL    NULL   2
    ....
*/





高手赐教!!!!





















------解决方案--------------------
大版那里不是有专门额外加上求和列的写法吗?
-恭贺xl_smlie始为人父 祝福恭喜之-