oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据

时间:2022-02-13 14:29:01
例如:
字段1   字段2
A        1
A        12
B        2
B        23
C        3
C        334
C        355

显示成
字段1  字段2  字段3  字段4
A          1       12
B          2       23
C          3       334      355

目前最多的就是有3个相同的

4 个解决方案

#1


该需求涉及到两个知识点:1、分析函数;2、行列转换。
先讲实现
第一步:建测试表
create table COL_TO_ROW
(
  COL1 VARCHAR2(20),
  COL2 VARCHAR2(20)
)
insert into col_to_row values('A','1');
insert into col_to_row values('A','12');
insert into col_to_row values('B','2');
insert into col_to_row values('B','23');
insert into col_to_row values('C','3');
insert into col_to_row values('C','334');
insert into col_to_row values('C','355')
select * from COL_TO_ROW

oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
第二步:对表进行分组,组内编号1,2,3
select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW
 
oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
第三步:行列转换,完成
select col1,max(decode(colnum,1,col2,null))colA,max(decode(colnum,2,col2,null))colB,max(decode(colnum,3,col2,null))colC from (
select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW 
)group by col1

oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
再讲知识点
1、row_number()over(partition by col1 order by col2)colnum
通过col1字段进行分组,并组内编号
row_number() over ([partition by col1] order by col2) ) as 别名
表示根据col1分组,在分组内部根据 col2排序
而这个“别名”的值就表示每组内部排序后的顺序编号(组内连续的唯一的),[partition by col1] 可省略。关于该知识点的实例详解,可以进我空间看看:http://user.qzone.qq.com/362701082/blog/1322635025
2、max(decode(colnum,1,col2,null))colA

#2


我的设计是动态的,应该能满足你的需求,假如一组内大于3个,你也可以继续扩展。有啥不明白的@我

#3


1楼大神已经为你分析的很清楚了

#4


oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据跪拜大神!

#1


该需求涉及到两个知识点:1、分析函数;2、行列转换。
先讲实现
第一步:建测试表
create table COL_TO_ROW
(
  COL1 VARCHAR2(20),
  COL2 VARCHAR2(20)
)
insert into col_to_row values('A','1');
insert into col_to_row values('A','12');
insert into col_to_row values('B','2');
insert into col_to_row values('B','23');
insert into col_to_row values('C','3');
insert into col_to_row values('C','334');
insert into col_to_row values('C','355')
select * from COL_TO_ROW

oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
第二步:对表进行分组,组内编号1,2,3
select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW
 
oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
第三步:行列转换,完成
select col1,max(decode(colnum,1,col2,null))colA,max(decode(colnum,2,col2,null))colB,max(decode(colnum,3,col2,null))colC from (
select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW 
)group by col1

oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据
再讲知识点
1、row_number()over(partition by col1 order by col2)colnum
通过col1字段进行分组,并组内编号
row_number() over ([partition by col1] order by col2) ) as 别名
表示根据col1分组,在分组内部根据 col2排序
而这个“别名”的值就表示每组内部排序后的顺序编号(组内连续的唯一的),[partition by col1] 可省略。关于该知识点的实例详解,可以进我空间看看:http://user.qzone.qq.com/362701082/blog/1322635025
2、max(decode(colnum,1,col2,null))colA

#2


我的设计是动态的,应该能满足你的需求,假如一组内大于3个,你也可以继续扩展。有啥不明白的@我

#3


1楼大神已经为你分析的很清楚了

#4


oracle 怎么能实现 一个字段相同,另一个字段不同,然后让这个相同的字段显示成一行数据跪拜大神!