Я пытаюсь объединить разные строки в одну, когда у них одинаковый идентификатор, но разные значения столбцов.

Например:

    (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

Или любой другой вариант вышеперечисленного, чтобы строки каким-то образом соединялись вместе.

Любая помощь будет оценена! Заранее спасибо.

9
LEJ 27 Ноя 2016 в 20:21

3 ответа

Лучший ответ

Пожалуйста, сначала прочтите мой комментарий - вам даже не следует думать об этом, если это ТОЛЬКО для целей отчетности, и вы хотите увидеть, как это можно сделать с помощью простого 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
mathguy 27 Ноя 2016 в 17:32

Попробуйте это, это работает для меня:

Здесь student - имя таблицы, а studentId - столбец. Мы можем объединить все предметы для конкретного ученика, используя GROUP_CONCAT.

SELECT studentId, GROUP_CONCAT(subjects) FROM student
0
Tim Diekmann 24 Май 2018 в 09:52

Следующее поможет решить вашу проблему первым из двух предложенных вами способов. 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 до максимального количества возможных цветов для данного идентификатора (это решение не является динамическим).

Кроме того, это помещает цвета в цвета color1, color2 и т. Д. На основе алфавитного порядка названий цветов. Если вы предпочитаете случайный порядок или другой порядок, вам нужно изменить order by.

3
Brian DeMilia 27 Ноя 2016 в 17:37