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 南京 南京...南京即得到一个直观的在一个月中人员出差地点的表格,无地点为空。
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 南京 南京...南京即得到一个直观的在一个月中人员出差地点的表格,无地点为空。
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'
Goif 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