繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM