[英]SQL Merge two rows with same ID but different column values (Oracle)
我正在尝试将不同的行合并为一个,因为它们具有相同的ID但不同的列值。
例如 :
(table1)
id colour
1 red
1 blue
2 green
2 red
我希望这个结合起来,结果是:
id colour1 colour2
1 red blue
2 green red
要么
id colour
1 red, blue
2 green, red
或者上面的任何其他变化,以便行以某种方式连接在一起。
任何帮助,将不胜感激! 提前致谢。
以下将以您提出的两种方式中的第一种方式解决您的问题。 Listagg
是你用它来解决它的两种方式中的第二种方法(如另一个答案中所指出的):
select id,
min(decode(rn,1,colour,null)) as colour1,
min(decode(rn,2,colour,null)) as colour2,
min(decode(rn,3,colour,null)) as colour3
from (
select id,
colour,
row_number() over(partition by id order by colour) as rn
from table1
)
group by id;
在这种方法中,您需要添加额外的case语句,直到给定ID的最大可能颜色数(此解决方案不是动态的)。
另外,这是根据颜色名称的字母顺序将颜色放入color1,color2等。 如果您更喜欢随机订单或其他订单,则需要更改order by
。
请首先阅读我的评论 - 您甚至不应该考虑这样做,除非它仅用于报告目的,并且您希望看到如何在纯SQL中完成此操作(而不是正确的解决方案,即使用您的报告这项工作的工具)。
第二种格式最简单,特别是如果您不关心颜色的显示顺序:
select id, listagg(colour, ', ') within group (order by null)
from table1
group by id
order by null
表示随机排序。 如果您想按其他方式order by
,请按order by
使用listagg()
。 例如,要按字母顺序排序颜色,您可以within group (order by colour)
。
对于第一种格式,您需要对列数进行先验限制,以及如何执行此操作取决于您使用的Oracle版本(您应该在此处以及其他讨论板上发布的每个问题中始终包含该版本) )。 这个概念被称为“旋转”; 从版本11开始,Oracle有一个可以使用的显式PIVOT运算符。
试试这个,它对我有用:
这里student
是表的名称, studentId
是一列。 我们可以使用GROUP_CONCAT
将所有科目合并到特定学生。
SELECT studentId, GROUP_CONCAT(subjects) FROM student
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.