首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求1简单语句,逆置行列

2012-09-07 
求一简单语句,逆置行列SQL codeTableAName Math English Physics Music小明 78889189小芳 81877680小王 66

求一简单语句,逆置行列

SQL code
TableAName Math English Physics Music小明 78    88      91      89小芳 81    87      76      80小王 66    58      59      76小李 99    77      89      85

转置成
SQL code
TableBcourse 小明 小芳 小王 小李Math    78  81    66   99English 88  87    58   77Physics 91  76    59   89Music   89  80    76   85

求脚本

[解决办法]
参考如下的存储过程:

/*
标题:90度旋转行列转换之一
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-05-08
地点:重庆航天职业学院
说明:无
*/
/*
数据库中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 语句实现?
*/

SQL code
/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/create proc p_zj       @tbname sysname, --要处理的表名       @fdname sysname, --做为转换的列名       @new_fdname sysname='' --为转换后的列指定列名asdeclare @s1 varchar(8000) , @s2 varchar(8000),        @s3 varchar(8000) , @s4 varchar(8000),        @s5 varchar(8000) , @i varchar(10)select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'select @s1 = @s1 + ',@' + @i + ' varchar(8000)',       @s2 = @s2 + ',@' + @i + '=''' + case isnull(@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(@i as int)+1from syscolumnswhere object_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--创建测试数据create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)insert Test select '1月',100,200,300 union allselect '2月',110,210,310 union allselect '3月',120,220,320 union allselect '4月',130,230,330go--用上面的存储过程测试:exec p_zj 'Test', '月份' , '项目'drop table Testdrop proc p_zj/*项目      1月      2月      3月      4月--------  ------   -------- -------- --------奖金      300      310      320      330工资      100      110      120      130福利      200      210      220      230(所影响的行数为 3 行)*/ 

热点排行