sql查询如何把一列转变成多列

时间:2022-07-28 10:52:58
如表:
typeid     parentid   name 
 1           0         t1
 2           0         t2
 3           1          m
 4           2          n
 5           3          a
变成下表:
id     name1       name2       name3
3        t1          m
4        t2          n
5        t1          m            a

9 个解决方案

#1


没看出规律来

#2


父与子。。可用递归

#3


参考:

/*
标题:SQL SERVER 2005中树结构数据分列显示
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
时间:2010-10-27
地点:陕西西安
*/

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , '000' , N'广东省')
insert into tb values('002' , '001' , N'深圳市')
insert into tb values('003' , '002' , N'宝安区')
insert into tb values('004' , '003' , N'龙华镇')
insert into tb values('005' , '004' , N'民治街道')
insert into tb values('011' , '111' , N'江西省')
insert into tb values('012' , '011' , N'南昌市')
insert into tb values('013' , '012' , N'南昌县')
insert into tb values('014' , '013' , N'麻丘镇')
insert into tb values('015' , '014' , N'龙井乡')
go

;with t as(
select pid , id , pid grp , name  from tb where pid not in (select id from tb)
union all
select tb.pid , tb.id , t.grp , tb.name name from tb , t where tb.pid = t.id
)
select [1] name1,[2] name2,[3] name3,[4] name4,[5] name5
from (select grp,name,row_number() over (partition by grp order by id) px from t) p 
pivot (max(name) for px in ([1],[2],[3],[4],[5])) pvt;

drop table tb

/*
name1      name2      name3      name4      name5
---------- ---------- ---------- ---------- ----------
广东省     深圳市     宝安区     龙华镇     民治街道
江西省     南昌市     南昌县     麻丘镇     龙井乡

(2 行受影响)
*/

#4


create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n'
insert into tb select 5, 3, 'a'
go
;with cte as(
select b.typeid as id,a.name as name1,b.name as name2 from tb a inner join tb b on a.typeid=b.parentid
)select a.id,
(case when b.name1 is null then a.name1 else b.name1 end) name1,
(case when b.name1 is null then a.name2 else b.name2 end) name2,
(case when b.name1 is null then '' else a.name2 end) name3
from cte a left join cte b on a.name1=b.name2
/*
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
4           t2         n          
5           t1         m          a

(3 行受影响)

*/
go
drop table tb

#5


看不明白

#6


好强,我是完全没看懂
引用 4 楼 qianjin036a 的回复:
SQL code
create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n……

#7


学习学习!!!!

#8


引用 4 楼 qianjin036a 的回复:
SQL code

create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, ……


如果表改成:
typeid parentid name  
 1      0        t1
 2      0        t2
 3      1         m
 4      2         n
 5      4         a
按照四楼的方法查询后为:
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
4           t2         n          
5           t2         n          a
怎么去除第二行的查询???


 

#9


这样行不?
create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n'
insert into tb select 5, 3, 'a'
go
;with cte as(
select b.typeid as id,a.name as name1,b.name as name2 from tb a inner join tb b on a.typeid=b.parentid where a.name<>'t2'
)select a.id,
(case when b.name1 is null then a.name1 else b.name1 end) name1,
(case when b.name1 is null then a.name2 else b.name2 end) name2,
(case when b.name1 is null then '' else a.name2 end) name3
from cte a left join cte b on a.name1=b.name2
/*
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
5           t1         m          a

(2 行受影响)

*/
go
drop table tb

#1


没看出规律来

#2


父与子。。可用递归

#3


参考:

/*
标题:SQL SERVER 2005中树结构数据分列显示
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
时间:2010-10-27
地点:陕西西安
*/

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , '000' , N'广东省')
insert into tb values('002' , '001' , N'深圳市')
insert into tb values('003' , '002' , N'宝安区')
insert into tb values('004' , '003' , N'龙华镇')
insert into tb values('005' , '004' , N'民治街道')
insert into tb values('011' , '111' , N'江西省')
insert into tb values('012' , '011' , N'南昌市')
insert into tb values('013' , '012' , N'南昌县')
insert into tb values('014' , '013' , N'麻丘镇')
insert into tb values('015' , '014' , N'龙井乡')
go

;with t as(
select pid , id , pid grp , name  from tb where pid not in (select id from tb)
union all
select tb.pid , tb.id , t.grp , tb.name name from tb , t where tb.pid = t.id
)
select [1] name1,[2] name2,[3] name3,[4] name4,[5] name5
from (select grp,name,row_number() over (partition by grp order by id) px from t) p 
pivot (max(name) for px in ([1],[2],[3],[4],[5])) pvt;

drop table tb

/*
name1      name2      name3      name4      name5
---------- ---------- ---------- ---------- ----------
广东省     深圳市     宝安区     龙华镇     民治街道
江西省     南昌市     南昌县     麻丘镇     龙井乡

(2 行受影响)
*/

#4


create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n'
insert into tb select 5, 3, 'a'
go
;with cte as(
select b.typeid as id,a.name as name1,b.name as name2 from tb a inner join tb b on a.typeid=b.parentid
)select a.id,
(case when b.name1 is null then a.name1 else b.name1 end) name1,
(case when b.name1 is null then a.name2 else b.name2 end) name2,
(case when b.name1 is null then '' else a.name2 end) name3
from cte a left join cte b on a.name1=b.name2
/*
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
4           t2         n          
5           t1         m          a

(3 行受影响)

*/
go
drop table tb

#5


看不明白

#6


好强,我是完全没看懂
引用 4 楼 qianjin036a 的回复:
SQL code
create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n……

#7


学习学习!!!!

#8


引用 4 楼 qianjin036a 的回复:
SQL code

create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, ……


如果表改成:
typeid parentid name  
 1      0        t1
 2      0        t2
 3      1         m
 4      2         n
 5      4         a
按照四楼的方法查询后为:
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
4           t2         n          
5           t2         n          a
怎么去除第二行的查询???


 

#9


这样行不?
create table tb(typeid int,parentid int,name varchar(10))
insert into tb select 1, 0, 't1'
insert into tb select 2, 0, 't2'
insert into tb select 3, 1, 'm'
insert into tb select 4, 2, 'n'
insert into tb select 5, 3, 'a'
go
;with cte as(
select b.typeid as id,a.name as name1,b.name as name2 from tb a inner join tb b on a.typeid=b.parentid where a.name<>'t2'
)select a.id,
(case when b.name1 is null then a.name1 else b.name1 end) name1,
(case when b.name1 is null then a.name2 else b.name2 end) name2,
(case when b.name1 is null then '' else a.name2 end) name3
from cte a left join cte b on a.name1=b.name2
/*
id          name1      name2      name3
----------- ---------- ---------- ----------
3           t1         m          
5           t1         m          a

(2 行受影响)

*/
go
drop table tb