/* 数据库中tb表格如下 月份 工资 福利 奖金 1月 100 200 300 2月 110 210 310 3月 120 220 320 4月 130 230 330 我想得到的结果是 项目 1月 2月 3月 4月 工资 100 110 120 130 福利 200 210 220 230 奖金 300 310 320 330 就是说完全把表格的行列颠倒,有点像那种旋转矩阵,请问如何用sql 语句实现? */ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[p_zj]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[p_zj]GO/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/createproc p_zj @tbname sysname, --要处理的表名@fdname sysname, --做为转换的列名@new_fdname sysname=''--为转换后的列指定列名asdeclare@s1varchar(8000) , @s2varchar(8000), @s3varchar(8000) , @s4varchar(8000), @s5varchar(8000) , @ivarchar(10) select@s1='' , @s2='' , @s3='' , @s4='' , @s5='' , @i='0'select@s1=@s1+',@'+@i+' varchar(8000)', @s2=@s2+',@'+@i+'='''+caseisnull(@new_fdname , '') when''then''else@new_fdname+'='end+''''''+ name +'''''''', @s3=@s3+'select @'+@i+'=@'+@i+'+'',['' + ['+@fdname+']+'']=''+cast(['+ name +'] as varchar) from ['+@tbname+']', @s4=@s4+',@'+@i+'=''select ''+@'+@i, @s5=@s5+'+'' union all ''+@'+@i, @i=cast(@iasint)+1from syscolumns whereobject_id(@tbname)=id and name<>@fdnameselect@s1=substring(@s1,2,8000), @s2=substring(@s2,2,8000), @s4=substring(@s4,2,8000), @s5=substring(@s5,16,8000) exec('declare '+@s1+'select '+@s2+@s3+'select '+@s4+' exec('+@s5+')') go--用上面的存储过程测试:createtable Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int) insert Test select'1月',100,200,300unionallselect'2月',110,210,310unionallselect'3月',120,220,320unionallselect'4月',130,230,330goexec p_zj 'Test', '月份' , '项目'droptable Test dropproc p_zj /* 项目 1月 2月 3月 4月 ---- ----------- ----------- ----------- ----------- 福利 200 210 220 230 工资 100 110 120 130 奖金 300 310 320 330 (所影响的行数为 3 行) *//* 静态写法(SQL2005) */--测试环境createtable Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int) insert Test select'1月',100,200,300unionallselect'2月',110,210,310unionallselect'3月',120,220,320unionallselect'4月',130,230,330go--测试语句SELECT*FROM ( SELECT 考核月份,月份,金额 FROM (SELECT 月份, 工资, 福利, 奖金 FROM Test) p UNPIVOT (金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt ) T PIVOT (MAX(金额) FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt --测试结果/* 考核月份 1月 2月 3月 4月 ------- ----- ----- ------ ------- 福利200210220230 工资100110120130 奖金300310320330 */--删除环境Droptable Test