求sql ......
现在求一条sql语句:
表结构如下:
idnamestatusworkdayremark
1001张三上班2011-11-10
1002李四上班2011-11-10
1003王五上班2011-11-10
1004张三上班2011-11-11
1005李四请假2011-11-11
1006王五上班2011-11-11
现在这个表结构需要统计出来的报表样式如下(报表统计周期为上月的26号到本月的25号)
姓名25号26号 .....1号 2号..10号11 号 ... 25号
张三....上班上班 ...
李四....上班请假 ...
王五....上班上班 ...
也就是说需要把纵向的workday (从上一个月的26号到本月的25号所有天)横响过来 显示,循环取出某个月度的所有员工考勤详情报表
求转换语句......
[解决办法]
行列转换。N多。
[解决办法]
- SQL code
--> --> (Roy)生成 if not object_id('Tempdb..#T') is null drop table #TGoCreate table #T([id] int,[name] nvarchar(2),[status] nvarchar(2),[workday] Datetime)Insert #Tselect 1001,N'张三',N'上班','2011-11-10' union allselect 1002,N'李四',N'上班','2011-11-10' union allselect 1003,N'王五',N'上班','2011-11-10' union allselect 1004,N'张三',N'上班','2011-11-11' union allselect 1005,N'李四',N'请假','2011-11-11' union allselect 1006,N'王五',N'上班','2011-11-11'Godeclare @dt1 datetime,@dt2 datetime,@dt3 datetimeset @dt1='2011-11-25'set @dt2=dateadd(m,-1,@dt1)+1set @dt3=@dt2declare @s nvarchar(4000)set @s=''while @dt1>=@dt2Select @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*/
[解决办法]
- SQL code
Create table tb([id] int,[name] nvarchar(2),[status] nvarchar(2),[workday] Datetime)Insert tbselect 1001,N'张三',N'上班','2011-11-10' union allselect 1002,N'李四',N'上班','2011-11-10' union allselect 1003,N'王五',N'上班','2011-11-10' union allselect 1004,N'张三',N'上班','2011-11-11' union allselect 1005,N'李四',N'请假','2011-11-11' union allselect 1006,N'王五',N'上班','2011-11-11'godeclare @sql varchar(8000)set @sql = 'select name 'select @sql = @sql + ' , max(case convert(varchar(10),workday,120) when ''' + dt + ''' then status else '''' end) [' + dt + ']'from ( select convert(varchar(10),dateadd(dd,num,cast(convert(varchar(8),dateadd(mm,-1,getdate()),120)+'26' as datetime)),120) dt from (select isnull((select count(1) from sysobjects where id<t.id),0) as num from sysobjects t) a where dateadd(dd,num,cast(convert(varchar(8),dateadd(mm,-1,getdate()),120)+'26' as datetime))<= convert(varchar(8),getdate(),120) + '25') as aset @sql = @sql + ' from tb where workday between convert(varchar(8),dateadd(mm,-1,getdate()),120)+''26'' and convert(varchar(8),getdate(),120) + ''25'' group by name 'exec(@sql) drop table tb/*name 2011-10-26 2011-10-27 2011-10-28 2011-10-29 2011-10-30 2011-10-31 2011-11-01 2011-11-02 2011-11-03 2011-11-04 2011-11-05 2011-11-06 2011-11-07 2011-11-08 2011-11-09 2011-11-10 2011-11-11 2011-11-12 2011-11-13 2011-11-14 2011-11-15 2011-11-16 2011-11-17 2011-11-18 2011-11-19 2011-11-20 2011-11-21 2011-11-22 2011-11-23 2011-11-24 2011-11-25 ---- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 李四 上班 请假 王五 上班 上班 张三 上班 上班 */