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.youkuaiyun.com/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html