需求:表中有字段1、字段2,數據如 (A,B), (A,C), (B,D), (C,E), (E,F)。期望按字段1分組,將字段2值橫向展開為 字段2、字段3、字段4…,如 A | B | D | null、A | C | E | F。
WM_CONCAT + 字符串分割(簡易版)SELECT 字段1,
WM_CONCAT(字段2) AS combined
FROM your_table
GROUP BY 字段1;
結果為逗號分隔字符串,應用層再分割。但 WM_CONCAT 為非文檔函數,生產環境慎用。
LISTAGG (Oracle 11g+, PostgreSQL, MySQL 8.0+)SELECT 字段1,
LISTAGG(字段2, ',') WITHIN GROUP (ORDER BY 字段2) AS cols
FROM your_table
GROUP BY 字段1;
SELECT 字段1,
MAX(CASE WHEN rn = 1 THEN 字段2 END) AS 字段2,
MAX(CASE WHEN rn = 2 THEN 字段2 END) AS 字段3,
MAX(CASE WHEN rn = 3 THEN 字段2 END) AS 字段4
FROM (
SELECT 字段1, 字段2,
ROW_NUMBER() OVER (PARTITION BY 字段1 ORDER BY 字段2) AS rn
FROM your_table
) t
GROUP BY 字段1;
GROUP_CONCAT / SQL Server STRING_AGG / PostgreSQL STRING_AGG語法類似 LISTAGG,按數據庫版本選擇。
若需動態列數(列名不固定),通常在應用層處理或使用動態 SQL 生成列,數據庫層面較複雜。