当前位置: 代码迷 >> Sql Server >> 求sql .解决办法
  详细解决方案

求sql .解决办法

热度:27   发布时间:2016-04-27 14:50:22.0
求sql ......
现在求一条sql语句:
  表结构如下:
  id name status workday remark
 
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 @[email protected]declare @s nvarchar(4000)set @s=''while @dt1>[email protected]Select   @[email protected]+N','+quotename(rtrim(Day(@dt2))+'号')+N'=max(case when Day([workday])=N'+quotename(Day(@dt2),'''')+N' then [status]  end)',@[email protected]+1--顯示生成語句print N'select [name][email protected]+N' from #T where [workday] between '''+convert(varchar(10),@dt3,120)+''' and '''+convert(varchar(10),@dt1,120)+'''  group by [name]'exec(N'select [name][email protected]+N' from #T where [workday] between [email protected]+''' and [email protected]+''' 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 ---- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 李四                                                                                                                                                                        上班         请假                                                                                                                                                        王五                                                                                                                                                                        上班         上班                                                                                                                                                        张三                                                                                                                                                                        上班         上班                                                                                                                                                        */
  相关解决方案