Select 将同一列的所有行数据合并到一列中

Select to get all rows data of same column into one column

我有一个 Table (TableA) 有 3 列 (ColA,ColB,ColC)

ColA 和 ColB 是主键

select *
from TableA
where ColA = '001';

给我这个

COLA COLB      COLC 
---- ----- -------- 
001  AA1        460  
001  AB1        380 
001  AC1        950  

我需要这种格式的结果

COLA         COLB         COLC
-----------  -----------  -------- 
001,001,001  AA1,AB1,AC1  460,380,950

即所有结果行都变成一行,该列的值到相应的列。

您可以使用 LISTAGG:

WITH tableA AS 
(
 SELECT '001' AS COLA, 'AA1' AS COLB, 460 AS COLC FROM dual
 UNION ALL SELECT '001','AB1',380 FROM dual
 UNION ALL SELECT '001','AC1',950 FROM dual
)
SELECT DISTINCT 
   LISTAGG(COLA, ', ') WITHIN GROUP (ORDER BY 1) AS COLA,
   LISTAGG(COLB, ', ') WITHIN GROUP (ORDER BY 1) AS COLB,
   LISTAGG(COLC, ', ') WITHIN GROUP (ORDER BY 1) AS COLC
FROM tableA
WHERE COLA = '001';

SqlFiddleDemo

输出:

╔════════════════╦════════════════╦═══════════════╗
║     COLA       ║     COLB       ║     COLC      ║
╠════════════════╬════════════════╬═══════════════╣
║ 001, 001, 001  ║ AA1, AB1, AC1  ║ 380, 460, 950 ║
╚════════════════╩════════════════╩═══════════════╝

但我还要添加 OVER 子句并从 COLA:

中删除重复项
WITH tableA AS 
(
 SELECT '001' AS COLA, 'AA1' AS COLB, 460 AS COLC FROM dual
 UNION ALL SELECT '001','AB1',380 FROM dual
 UNION ALL SELECT '001','AC1',950 FROM dual
)
SELECT DISTINCT 
   COLA,
   LISTAGG(COLB, ', ') WITHIN GROUP (ORDER BY 1) OVER(PARTITION BY COLA) AS COLB,
   LISTAGG(COLC, ', ') WITHIN GROUP (ORDER BY 1) OVER(PARTITION BY COLA) AS COLC
FROM tableA
WHERE COLA = '001';

SqlFiddleDemo2 SqlFiddleDemo3