如何用SQL将多条记录的某个字段拼接起来?

时间:2021-09-13 15:08:38
比如,表T1,有Id,Name,Sex,并有如下记录:
Id  Name  Sex
1   张    男
1   三    男
1   丰    男
2   陈    女
2   晓    女
2   薇    女

希望查出结果如下:
Id  Name_full  Sex
1   张三丰     男
2   陈晓薇     女

多谢!

7 个解决方案

#1


with t (t1,t2,t3) as (
values
('a','b','1'),('a','b','2'),('b','c','1'),
('b','c','2'),('b','c','3'),('d','e','1')
),
t1(t11,t22,t33,t44,t55) as (
select t1,t2,t3,rownumber() over(partition by t1,t2),rownumber() over(partition by t1,t2) as t4 from t
),
t3(s1,s2,s3,s4,s5) as(
select t11,t22,cast(t33 as varchar(100)),t44,t55 from t1 where T44 =1 and t55=1
union all
select a.s1,a.s2,cast(a.s3||b.t33 as varchar(100)),a.s4+1,a.s5 from t3 a,t1 b
where a.s1=b.t11 and a.s4 = b.t55-1)
select s1,s2,s3 from t3 x where x.s4=(select max(s4) from t3 y where x.s1=y.s1) order by s1,s2



替换一下字段,用这个例子试试吧

#2


引用 1 楼 zhaojianmi1 的回复:
with t (t1,t2,t3) as (
values
('a','b','1'),('a','b','2'),('b','c','1'),
('b','c','2'),('b','c','3'),('d','e','1')
),
t1(t11,t22,t33,t44,t55) as (
select t1,t2,t3,rownumber() over(partition by t……


先感谢你的回答,我发现我描述的不对了,我现在是2个表,T1(Id,Familyname,Sex);T2(Id,Givenname).
T1:
Id Familyname Sex
01  张            男
02  陈            女

T2:
Id Givenname
01  三丰
02  晓微

结果:01 张三丰 男;02 陈晓薇 女。

谢谢。

#3


T2 应该为 (Id, other_name)
Id  other_name
01  三
01  丰
02  晓
02  薇

#4


我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。

#5


引用 4 楼 zhaojianmi1 的回复:
我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。


是的,T2会有一个order在来决定顺序。

#6


哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”

#7


引用 6 楼 zhaojianmi1 的回复:
哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”

非常感谢!!!

#1


with t (t1,t2,t3) as (
values
('a','b','1'),('a','b','2'),('b','c','1'),
('b','c','2'),('b','c','3'),('d','e','1')
),
t1(t11,t22,t33,t44,t55) as (
select t1,t2,t3,rownumber() over(partition by t1,t2),rownumber() over(partition by t1,t2) as t4 from t
),
t3(s1,s2,s3,s4,s5) as(
select t11,t22,cast(t33 as varchar(100)),t44,t55 from t1 where T44 =1 and t55=1
union all
select a.s1,a.s2,cast(a.s3||b.t33 as varchar(100)),a.s4+1,a.s5 from t3 a,t1 b
where a.s1=b.t11 and a.s4 = b.t55-1)
select s1,s2,s3 from t3 x where x.s4=(select max(s4) from t3 y where x.s1=y.s1) order by s1,s2



替换一下字段,用这个例子试试吧

#2


引用 1 楼 zhaojianmi1 的回复:
with t (t1,t2,t3) as (
values
('a','b','1'),('a','b','2'),('b','c','1'),
('b','c','2'),('b','c','3'),('d','e','1')
),
t1(t11,t22,t33,t44,t55) as (
select t1,t2,t3,rownumber() over(partition by t……


先感谢你的回答,我发现我描述的不对了,我现在是2个表,T1(Id,Familyname,Sex);T2(Id,Givenname).
T1:
Id Familyname Sex
01  张            男
02  陈            女

T2:
Id Givenname
01  三丰
02  晓微

结果:01 张三丰 男;02 陈晓薇 女。

谢谢。

#3


T2 应该为 (Id, other_name)
Id  other_name
01  三
01  丰
02  晓
02  薇

#4


我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。

#5


引用 4 楼 zhaojianmi1 的回复:
我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。


是的,T2会有一个order在来决定顺序。

#6


哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”

#7


引用 6 楼 zhaojianmi1 的回复:
哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”

非常感谢!!!