在一行中的一列中合并多个列值Oracle SQL

时间:2018-06-06 20:34:49

标签: sql oracle pivot unpivot listagg

我有多个列需要在一行中聚合到列中。

之前

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 :(得分: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;

希望这有帮助。