Объединение нескольких значений столбцов в одном столбце в одной строке Oracle SQL
У меня есть несколько столбцов, которые должны быть объединены в столбец в одной строке.
До
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 ответа
Для этого вам не нужен список ошибок, вы можете просто объединить все столбцы следующим образом:
select colnum, col1||','||col2||','||col3 as col1234
from columnMerger
COLNUM COL1234
1 a,b,c
Пока вам не нужно использовать 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;
Надеюсь это поможет.