将多列值合并到一行中的一列中 Oracle SQL

Merge multiple columns values in one column in one row 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 来合并列,但出现错误

"single-row subquery returns more than one row"

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; 

任何帮助将不胜感激,谢谢。

为此您不需要 listagg,您可以按如下方式连接所有列 -

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() 错误的原因是该函数需要每一行的标量值。 (您还缺少 UNPIVOT 子句中的 IN。)

如果您需要不同的值,那么您需要如下内容:

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;

希望对您有所帮助。