T出差: 日期,人员,地点,返回日期 0506 A 上海 0506 0508 A 北京 0510 0501 B 河北 0508 0520 C 南京 0610 ......... 我想得到一个表格: 序号,姓名,01,02,03,04,05,06,07,08, 09, 10....20....31 (指日期) 01 A 上海 北京 北京 北京 02 B 河北 河北 河北 .... 河北 03 C 南京 南京...南京 即得到一个直观的在一个月中人员出差地点的表格,无地点为空。
以5月為例
-
SQL code
-
if not object_id ( ' T ' ) is null drop table T Go Create table T( [ 日期 ] nvarchar ( 4 ), [ 人员 ] nvarchar ( 1 ), [ 地点 ] nvarchar ( 2 ), [ 返回日期 ] nvarchar ( 4 )) Insert T select N ' 0506 ' ,N ' A ' ,N ' 上海 ' ,N ' 0506 ' union all select N ' 0508 ' ,N ' A ' ,N ' 北京 ' ,N ' 0510 ' union all select N ' 0501 ' ,N ' B ' ,N ' 河北 ' ,N ' 0508 ' union all select N ' 0520 ' ,N ' C ' ,N ' 南京 ' ,N ' 0610 ' Go if object_id ( ' Tempdb..# ' ) is not null drop table # select top 10 ID = identity ( int , 1 , 1 ) into # from sysobjects -- 輔助表 declare @s nvarchar ( 4000 ), @i int select @s = '' , @i = 31 while @i > 0 select @s = ' , ' + quotename ( @i ) + N ' =max(case when day([日期])= ' + rtrim ( @i ) + N ' then [地点] else '''' end) ' + @s , @i = @i - 1 exec ( ' select [人员] ' + @s + ' from (Select dateadd(d,t2.ID,cast( '' 08 '' +[日期] as datetime)) [日期],[人员],[地点] from T join # t2 on dateadd(d,t2.ID,cast( '' 08 '' +[日期] as datetime))<=cast( '' 08 '' +[返回日期] as datetime))Tab group by [人员] ' ) 人员 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 26 27 28 29 30 31 -- -- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- A 北京 北京 B 河北 河北 河北 河北 河北 河北 河北 C 南京 南京 南京 南京 南京 南京 南京 南京 南京 南京 ( 3 個資料列受到影響)以上需要輔助表.. 行列互轉例子: http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html