90度旋转行列转换之一

/*
标题: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 = '' -- 为转换后的列指定列名 as declare @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 ) + 1 from syscolumns where object_id ( @tbname ) = id and name <> @fdname select @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 all select ' 2月 ' , 110 , 210 , 310 union all select ' 3月 ' , 120 , 220 , 320 union all select ' 4月 ' , 130 , 230 , 330 go -- 用上面的存储过程测试: exec p_zj ' Test ' , ' 月份 ' , ' 项目 ' drop table Test drop proc p_zj /* 项目 1月 2月 3月 4月 -------- ------ -------- -------- -------- 奖金 300 310 320 330 工资 100 110 120 130 福利 200 210 220 230 (所影响的行数为 3 行) */


SQL code
    
    
-- SQL2005静态写法 -- 创建测试数据 create table Test(月份 varchar ( 4 ), 工资 int , 福利 int , 奖金 int ) insert Test select ' 1月 ' , 100 , 200 , 300 union all select ' 2月 ' , 110 , 210 , 310 union all select ' 3月 ' , 120 , 220 , 320 union all select ' 4月 ' , 130 , 230 , 330 go SELECT * FROM ( SELECT 考核月份,月份,金额 FROM ( SELECT 月份, 工资, 福利, 奖金 FROM Test) p UNPIVOT (金额 FOR 考核月份 IN (工资, 福利, 奖金)) AS unpvt ) T PIVOT ( MAX (金额) FOR 月份 in ( [ 1月 ] , [ 2月 ] , [ 3月 ] , [ 4月 ] )) AS pt drop table test /* 项目 1月 2月 3月 4月 -------- ------ -------- -------- -------- 奖金 300 310 320 330 工资 100 110 120 130 福利 200 210 220 230 (3 行受影响) */
    
    
SQL code
        
        
select max ( case ITEM1 when ' LineCustomizationAmount ' then ITEM2 else '' end ) as LineCustomizationAmount, max ( case ITEM1 when ' LineDiscountAmount ' then ITEM2 else '' end ) as LineDiscountAmount, max ( case ITEM1 when ' LineGiftWrapAmount ' then ITEM2 else '' end ) as LineGiftWrapAmount from tb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值