日期:2014-05-19  浏览次数:20822 次

求一函数:把行变列?

select     1, 'A ', 'B ', 'C '
union   all  
select     2, 'AA ', 'BB ', 'CC '

--写函数   转换的结果为
select   1, 'A '     union   all  
select   1, 'B '   union   all  
select   1, 'C '   union   all  
select   2, 'AA '   union   all  
select   2, 'BB '   union   all  
select   2, 'CC '  


------解决方案--------------------
declare @t table
(id int, c1 varchar(100), c2 varchar(100), c3 varchar(100))

insert into @t
select 1, 'a ', 'b ', 'c ' union select 2, 'aa ', 'bb ', 'cc '

select id,c1 from @t union select id,c2 from @t union select id,c3 from @t

/*
1 a
1 b
1 c
2 aa
2 bb
2 cc
*/
------解决方案--------------------

select id,c1 from (select id=1,c1= 'A ',c2= 'B ',c3= 'C ' union all select id=2,c1= 'AA ',c2= 'BB ',c3= 'CC ') t union all
select id,c2 from (select id=1,c1= 'A ',c2= 'B ',c3= 'C ' union all select id=2,c1= 'AA ',c2= 'BB ',c3= 'CC ') t union all
select id,c3 from (select id=1,c1= 'A ',c2= 'B ',c3= 'C ' union all select id=2,c1= 'AA ',c2= 'BB ',c3= 'CC ') t
------解决方案--------------------
create table t(id int,val1 char(2),val2 char(2),val3 char(2));
insert into t
select 1, 'A ', 'B ', 'C '
union all
select 2, 'AA ', 'BB ', 'CC '

select * from t;
declare @col varchar(8000),@field varchar(20),@i int,@first varchar(20)
set @col= ' '
set @field= ' '
declare cur_t cursor for select name from syscolumns where object_id( 't ')=id;
open cur_t
fetch cur_t into @field
set @first= 'union select '+@field+ ', '
fetch cur_t into @field
while @@fetch_status=0
begin
set @col=@col+@first+@field+ ' from t '
fetch cur_t into @field
print(@col)
end
set @col=right(@col,len(@col)-5)
exec(@col)
print(@col)
close cur_t
deallocate cur_t

------解决方案--------------------
整理一下

create table t(id int,val1 char(2),val2 char(2),val3 char(2));
insert into t
select 1, 'A ', 'B ', 'C '
union all
select 2, 'AA ', 'BB ', 'CC '

select * from t;
declare @col varchar(8000),@field varchar(100),@first varchar(100)
set @col= ' '
set @field= ' '
declare cur_t cursor for select name from syscolumns where object_id( 't ')=id;
open cur_t
fetch cur_t into @field
set @first= 'union select '+@field+ ', '
fetch cur_t into @field
while @@fetch_status=0
begin
set @col=@col+@first+@field+ ' from t '
fetch cur_t into @field
end
set @col=right(@col,len(@col)-5)
exec(@col)
close cur_t
deallocate cur_t