我有多个列需要在一行中聚合到列中。
之前
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;
任何帮助都会感激不尽,谢谢。
答案 0 :(得分:1)
您不需要listagg,您可以按如下方式连接所有列 -
select colnum, col1||','||col2||','||col3 as col1234
from columnMerger
COLNUM COL1234
1 a,b,c
答案 1 :(得分:1)
虽然在这种情况下您不需要使用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;
希望这有帮助。