Объединить несколько значений столбцов в одном столбце в одной строке Oracle SQL - PullRequest
0 голосов
/ 06 июня 2018

У меня есть несколько столбцов, которые должны быть объединены в столбец в одной строке.

До

Table name: columnMerger
colNum col1 col2 col3
1      a    b    c   

После

colNum      col1234
1           a, b, c

Шаг 1, я использовал unpivot, чтобы собрать все в одном столбце

 select colNum, value from columnMerger unpivot (value for node (col1, col2, col3)); 

Результат,

colNum  value
1       a
1       b
1       c

Шаг 2, Приведенный listagg, чтобы объединить столбцы, однако я получаю ошибку

"Подстрочный запрос из одной строки возвращает более одной строки"

select colNum, listagg((
select distinct value from columnMerger unpivot (value for node (col1, col2, col3)), ',') 
within group (order by colNum) from columnMerger group by colNum; 

Любая помощьбыл бы благодарен, спасибо.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Хотя вам не нужно использовать UNPIVOT в этом случае - и это, вероятно, излишне - чтобы использовать LISTAGG() с вашим запросом UNPIVOT, вы захотите сделать следующее:

SELECT colnum, LISTAGG(value, ',') WITHIN GROUP ( ORDER BY value ) AS col1234
  FROM (
    SELECT colnum, value
      FROM columnmerger
    UNPIVOT (
        value for node IN (col1, col2, col3)
    )
) GROUP BY colnum;

Причина, по-моему, вы получаете ошибку с LISTAGG() в том, что функция ожидает скалярное значение для каждой строки.(Вы также пропустили IN в своем предложении UNPIVOT.)

Если вам нужны разные значения, вам понадобится что-то вроде следующего:

SELECT colnum, LISTAGG(value, ',') WITHIN GROUP ( ORDER BY value ) AS col1234
  FROM (
    SELECT DISTINCT colnum, value
      FROM columnmerger
    UNPIVOT (
        value for node IN (col1, col2, col3)
    )
) GROUP BY colnum;

Надеюсь, это поможет.

0 голосов
/ 06 июня 2018

Для этого вам не нужен список ошибок, вы можете просто объединить все столбцы следующим образом -

select colnum, col1||','||col2||','||col3 as col1234
from columnMerger

COLNUM  COL1234
1       a,b,c
...