日期:2014-05-18 浏览次数:20511 次
贴了算了 /* 将表数据旋转90度(2007-11-19于海南三亚) 将下表数据: A b c d e -------------------- ----------- ----------- ----------- ----------- x 1 2 3 4 y 5 6 7 8 z 9 10 11 12 转化成如下结果: a x y z -------------------- ---------- ---------- ---------- b 1 5 9 c 2 6 10 d 3 7 11 e 4 8 12 */ --生成测试数据 create table test1(A varchar(20),b int,c int,d int,e int) insert into test1 select 'x',1,2 ,3 ,4 insert into test1 select 'y',5,6 ,7 ,8 insert into test1 select 'z',9,10,11,12 go --生成中间数据表 declare @s varchar(8000) set @s = 'create table test2(a varchar(20)' select @s = @s + ',' + A + ' varchar(10)' from test1 set @s = @s + ')' exec(@s) print @s --借助中间表实现行列转换 declare @name varchar(20) declare t_cursor cursor for select name from syscolumns where id=object_id('test1') and colid > 1 order by colid open t_cursor fetch next from t_cursor into @name while @@fetch_status = 0 begin exec('select ' + @name + ' as t into test3 from test1') set @s='insert into test2 select ''' + @name + '''' select @s = @s + ',''' + rtrim(t) + '''' from test3 exec(@s) exec('drop table test3') fetch next from t_cursor into @name end close t_cursor deallocate t_cursor --查看行列互换处理结果 select * from test1 select * from test2 --删除表 drop table test1 drop table test2 ---------------------------------------- /*固定的写法:*/ select t1.* , t2.y , t3.z from (select a = 'b' , x = b from test1 where a = 'x') t1, (select a = 'b' , y = b from test1 where a = 'y') t2, (select a = 'b' , z = b from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'c' , x = c from test1 where a = 'x') t1, (select a = 'c' , y = c from test1 where a = 'y') t2, (select a = 'c' , z = c from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'd' , x = d from test1 where a = 'x') t1, (select a = 'd' , y = d from test1 where a = 'y') t2, (select a = 'd' , z = d from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a union all select t1.* , t2.y , t3.z from (select a = 'e' , x = e from test1 where a = 'x') t1, (select a = 'e' , y = e from test1 where a = 'y') t2, (select a = 'e' , z = e from test1 where a = 'z') t3 where t1.a = t2.a and t1.a = t2.a ---------------------------------------- /* 表tb,数据如下: 项目种类 业绩 提成 洗吹类 200 10 外卖 100 5 合计 300 15 转换成: 项目种类 洗吹类 外卖 合计 业绩 200 100 300 提成 10 5 15 */ create table tb ( 项目种类 varchar(10), 业绩 int, 提成 int ) insert into tb(项目种类,业绩,提成) values('洗吹类',200,10) insert into tb(项目种类,业绩,提成) values('外卖' ,100,5) insert into tb(项目种类,业绩,提成) values('合计' ,300,15) go select 项目种类,sum(洗吹类) as 洗吹类 , sum(外卖) as 外卖 , sum(合计) as 合计 from ( select 项目种类 = '业绩', 洗吹类 = case when 项目种类 = '洗吹类' then 业绩 else 0 end, 外卖 = case when 项目种类 = '外卖' then 业绩 else 0 end, 合计 = case when 项目种类 = '合计' then 业绩 else 0 end from tb union all select 项目种类 = '提成' , 洗吹类 = case when 项目种类 = '洗吹类' then 提成 else 0 end, 外卖 = case when 项目种类 = '外卖' then 提成 else 0 end, 合计 = case when 项目种类 = '合计' then 提成 else 0