103.列转行

--行列转换示例--列变行

--测试数据
create table 表(id int,proc1 decimal(20,1),proc2 decimal(20,1),proc3 decimal(20,1))
insert 表 select 12,3.4,6.7,1.1
union all select 13,5.6,10.3,5.6
union all select 14,7.9,9.0,9.9
go

--查询处理
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+'=''select id,[proc]='''''+name+''''',value=['+name+'] from 表'''
	,@s3=@s3+'+'' union all ''+@'+@i
	,@i=cast(@i as int)+1
from syscolumns 
where object_id('表')=id and name<>'id'

select @s1=substring(@s1,2,8000)
	,@s2=substring(@s2,2,8000)
	,@s3=substring(@s3,16,8000)

exec('declare '+@s1+'
select '+@s2+'
exec(''select * from(''+'+@s3+'+'')a order by id'')')
go


--删除测试
drop table 表

/*--测试结果

id          proc  value                  
----------- ----- ---------------------- 
12          proc1 3.4
12          proc2 6.7
12          proc3 1.1
13          proc3 5.6
13          proc2 10.3
13          proc1 5.6
14          proc1 7.9
14          proc2 9.0
14          proc3 9.9

(所影响的行数为 9 行)
--*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值