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
;
替换一下字段,用这个例子试试吧
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
先感谢你的回答,我发现我描述的不对了,我现在是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 薇
Id other_name
01 三
01 丰
02 晓
02 薇
#4
我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。
你这样存储会发生“张丰三”、“薇晓”。。。
#5
是的,T2会有一个order在来决定顺序。
#6
哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”
#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
;
替换一下字段,用这个例子试试吧
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
先感谢你的回答,我发现我描述的不对了,我现在是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 薇
Id other_name
01 三
01 丰
02 晓
02 薇
#4
我想问啊,你这个T2不对吧,名字应该有顺序吧
你这样存储会发生“张丰三”、“薇晓”。。。
你这样存储会发生“张丰三”、“薇晓”。。。
#5
是的,T2会有一个order在来决定顺序。
#6
哦,算法就是上面的递归,可能得根据你的具体情况做一些改进,比如你说的T2表数据有顺序,T1应该也有顺序吧,那种复姓的,如:“西门吹雪”
#7
非常感谢!!!