SQL合并具有相同ID但不同列值的两行(Oracle)

时间:2016-11-27 17:21:56

标签: sql 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

或上述任何其他变体,以便行以某种方式连接在一起。

任何帮助将不胜感激!提前谢谢。

3 个答案:

答案 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