SQL横向表转纵向表

oJueBan1 2016-06-29 11:56:49
请大神帮忙
现有一张表,表数据为:
A B C D E
1 2 3 4 5
想把它转换为:
A 1
B 2
C 3
D 4
E 5
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-06-30
  • 打赏
  • 举报
回复
引用 5 楼 oJueBan1 的回复:
但是如果用临时表,且不在Tempdb库里,好像就不起作用了。
这样用

create table #t(A int, B int, C int, D int, E int)

insert into #t
  select 1, 2, 3, 4, 5



DECLARE @Sql NVARCHAR(max)=''

SELECT @Sql=@Sql+','+QUOTENAME(name) FROM tempdb.sys.columns WHERE object_id=OBJECT_ID('Tempdb..#T')
SET @Sql=STUFF(@Sql,1,1,'')

EXEC('select *
  from #T
  unpivot(Value for ColName in('+@Sql+')) b')
  /*
  Value	ColName
1	A
2	B
3	C
4	D
5	E*/
oJueBan1 2016-06-30
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:

create table #t(A int, B int, C int, D int, E int)

insert into #t
  select 1, 2, 3, 4, 5


select col,val
  from #t a
  unpivot(val for col in([A],[B],[C],[D],[E])) b

/*
col                             val
------------------------ -----------
A                              1
B                              2
C                              3
D                              4
E                              5

(5 row(s) affected)
*/
oJueBan1 2016-06-30
  • 打赏
  • 举报
回复
+@Sql+')) b') [/code][/quote]
引用 3 楼 roy_88 的回复:
use tempdb
GO
create table T(A int, B int, C int, D int, E int)
 
insert into T
  select 1, 2, 3, 4, 5
 GO
DECLARE @Sql NVARCHAR(max)=''

SELECT @Sql=@Sql+'UNION ALL SELECT '+QUOTENAME(name,'''')+' AS ColName,Value='+name+' FROM T ' FROM sys.columns WHERE object_id=OBJECT_ID('T')
SET @Sql=STUFF(@Sql,1,10,'')


EXEC(@Sql)
明白了,我把临时表与 sys.columns 指向tempdb就可以了,谢谢!
oJueBan1 2016-06-30
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
use tempdb
GO
create table T(A int, B int, C int, D int, E int)
 
insert into T
  select 1, 2, 3, 4, 5
 GO
DECLARE @Sql NVARCHAR(max)=''

SELECT @Sql=@Sql+'UNION ALL SELECT '+QUOTENAME(name,'''')+' AS ColName,Value='+name+' FROM T ' FROM sys.columns WHERE object_id=OBJECT_ID('T')
SET @Sql=STUFF(@Sql,1,10,'')


EXEC(@Sql)
但是如果用临时表,且不在Tempdb库里,好像就不起作用了。
唐诗三百首 2016-06-29
  • 打赏
  • 举报
回复

create table #t(A int, B int, C int, D int, E int)

insert into #t
  select 1, 2, 3, 4, 5


select col,val
  from #t a
  unpivot(val for col in([A],[B],[C],[D],[E])) b

/*
col                             val
------------------------ -----------
A                              1
B                              2
C                              3
D                              4
E                              5

(5 row(s) affected)
*/
中国风 2016-06-29
  • 打赏
  • 举报
回复
你可用#1方法转动态写法

DECLARE @Sql NVARCHAR(max)=''

SELECT @Sql=@Sql+','+QUOTENAME(name) FROM sys.columns WHERE object_id=OBJECT_ID('T')
SET @Sql=STUFF(@Sql,1,1,'')


EXEC('select *
  from T
  unpivot(Value for ColName in('+@Sql+')) b')
中国风 2016-06-29
  • 打赏
  • 举报
回复
use tempdb
GO
create table T(A int, B int, C int, D int, E int)
 
insert into T
  select 1, 2, 3, 4, 5
 GO
DECLARE @Sql NVARCHAR(max)=''

SELECT @Sql=@Sql+'UNION ALL SELECT '+QUOTENAME(name,'''')+' AS ColName,Value='+name+' FROM T ' FROM sys.columns WHERE object_id=OBJECT_ID('T')
SET @Sql=STUFF(@Sql,1,10,'')


EXEC(@Sql)
足球不是方的 2016-06-29
  • 打赏
  • 举报
回复
行转列,列转行,看下unpivot,pivot这2个关键字的用法,以后就会了

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧