读书人

求sql .解决办法

发布时间: 2012-04-20 15:27:03 作者: rapoo

求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 ---- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 李四                                                                                                                                                                        上班         请假                                                                                                                                                        王五                                                                                                                                                                        上班         上班                                                                                                                                                        张三                                                                                                                                                                        上班         上班                                                                                                                                                        */ 

读书人网 >SQL Server

热点推荐