SQL合并具有相同ID但不同列值的两行(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

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

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

原文由 LEJ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 922
2 个回答

请先阅读我的评论-您甚至不应该考虑这样做,除非它仅用于报告目的,并且您想看看如何在普通 SQL 中完成此操作(而不是正确的解决方案,即使用您的报告这项工作的工具)。

第二种格式最简单,特别是如果您不关心颜色出现的顺序:

 select   id, listagg(colour, ', ') within group (order by null)
from     table1
group by id

order by null 表示随机订购。如果您想通过其他方式订购,请在 order bylistagg() 中使用它。例如,要按字母顺序排列颜色,您可以说 within group (order by colour)

对于第一种格式,您需要对列数有一个先验限制,并且如何做到这一点取决于您使用的 Oracle 版本(您应该始终将其包含在您在此处和其他讨论板上发布的每个问题中)。这个概念被称为“枢轴”;从版本 11 开始,Oracle 有一个可以使用的显式 PIVOT 运算符。

原文由 user5683823 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下将以您提出的两种方式中的第一种方式解决您的问题。 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

原文由 Brian DeMilia 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进