多列合并成一列,在线等

时间:2021-11-09 16:16:28
数据源表如下:

公司A       公司B        公司C       ..........
公司1       公司4        公司7       ..........
公司2      公司5         公司8       ..........
公司3      公司6         公司9      ............

希望得到下列结果:
公司
公司1
公司2
公司3
公司4
公司5
公司6
公司7
公司8
公司9
.........

实际数据可能有几百列。
请问用SQL语句如何实现。

9 个解决方案

#1


SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      (列1, 列2, 列3, 列4, 列5) -- 几百个列名都写在这里
) u

#2


这么多列,难道我都要写出来吗,能够用个变量呢。

#3


配合 select name from sys.all_columns where object_id=object_id('tbname')

#4


你的意思是做嵌套查询,我试试吧。

#5



create table t
(公司A varchar(20),
公司B varchar(20),
公司C varchar(20)
)

select * from t 

insert into t values('公司1','公司2','公司3')
insert into t values('公司4','公司5','公司6')
insert into t values('公司7','公司8','公司9')
insert into t values('公司10','公司11','公司12')

declare @sql varchar(8000) 
set @sql='';
select @sql=@sql+'UNION ALL select '+quotename(Name) +' 公司  from t '
from syscolumns where ID=object_id('t')
set @sql=STUFF(@sql,1,9,'')
exec  (@sql)

#6


declare @col varchar(max)
set @col=''
select  @col=@col +','+ name from syscolumns where id=object_id('tb1')
set @col= stuff(@col,1,1,'')
print(
'SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      ('+@col+')
) u'
)

#7


declare @col varchar(max)
set @col=''
select  @col=@col +','+ name from syscolumns where id=object_id('tb1')
set @col= stuff(@col,1,1,'')
exec(
'SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      ('+@col+')
) u'
)

#8


还有更好的方法吗?

#9


你回帖的这个功夫,用复制、粘贴、替换,早就把几百个列名的SQL写好了!

#1


SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      (列1, 列2, 列3, 列4, 列5) -- 几百个列名都写在这里
) u

#2


这么多列,难道我都要写出来吗,能够用个变量呢。

#3


配合 select name from sys.all_columns where object_id=object_id('tbname')

#4


你的意思是做嵌套查询,我试试吧。

#5



create table t
(公司A varchar(20),
公司B varchar(20),
公司C varchar(20)
)

select * from t 

insert into t values('公司1','公司2','公司3')
insert into t values('公司4','公司5','公司6')
insert into t values('公司7','公司8','公司9')
insert into t values('公司10','公司11','公司12')

declare @sql varchar(8000) 
set @sql='';
select @sql=@sql+'UNION ALL select '+quotename(Name) +' 公司  from t '
from syscolumns where ID=object_id('t')
set @sql=STUFF(@sql,1,9,'')
exec  (@sql)

#6


declare @col varchar(max)
set @col=''
select  @col=@col +','+ name from syscolumns where id=object_id('tb1')
set @col= stuff(@col,1,1,'')
print(
'SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      ('+@col+')
) u'
)

#7


declare @col varchar(max)
set @col=''
select  @col=@col +','+ name from syscolumns where id=object_id('tb1')
set @col= stuff(@col,1,1,'')
exec(
'SELECT 公司名称
  FROM table1
UNPIVOT
   (Orders FOR 公司名称 IN 
      ('+@col+')
) u'
)

#8


还有更好的方法吗?

#9


你回帖的这个功夫,用复制、粘贴、替换,早就把几百个列名的SQL写好了!