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';
输出:
╔════════════════╦════════════════╦═══════════════╗
║ 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';
我有一个 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';
输出:
╔════════════════╦════════════════╦═══════════════╗
║ 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';