我正在尝试将不同的行合并为一个,因为它们具有相同的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
或上述任何其他变体,以便行以某种方式连接在一起。
任何帮助将不胜感激!提前谢谢。
答案 0 :(得分:2)
以下内容将以您提出的两种方式中的第一种方式解决您的问题。 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
。
答案 1 :(得分:1)
请先阅读我的评论 - 你甚至不应该考虑这样做,除非它仅用于报告目的,你想看看如何在普通的SQL中完成这一点(而不是正确的解决方案,这是使用您的报告工具完成这项工作。)
第二种格式最简单,特别是如果您不关心颜色的显示顺序:
select id, listagg(colour, ', ') within group (order by null)
from table1
group by id
order by null
表示随机排序。如果您想通过其他内容订购,请在order by
中使用listagg()
。例如,要按字母顺序排序颜色,您可以说within group (order by colour)
。
对于第一种格式,您需要对列数有先验限制,以及如何执行此操作取决于您使用的Oracle版本(您应该始终包含在此处和此处发布的每个问题中)其他讨论区)。这个概念被称为“旋转”;从版本11开始,Oracle就有了一个可以使用的显式PIVOT运算符。
答案 2 :(得分:0)
试试这个,它对我有用:
此处student
是表格的名称,studentId
是列。我们可以使用GROUP_CONCAT
将所有科目合并到特定学生。
SELECT studentId, GROUP_CONCAT(subjects) FROM student