首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 進階:將多行記錄轉換為單行多列(行轉列)實現方案

     編輯:程式設計綜合問答

需求:表中有字段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。

方案一:Oracle 使用 WM_CONCAT + 字符串分割(簡易版)

SELECT 字段1,
       WM_CONCAT(字段2) AS combined
FROM   your_table
GROUP BY 字段1;

結果為逗號分隔字符串,應用層再分割。但 WM_CONCAT 為非文檔函數,生產環境慎用。

方案二:標準 SQL 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;

方案四:MySQL GROUP_CONCAT / SQL Server STRING_AGG / PostgreSQL STRING_AGG

語法類似 LISTAGG,按數據庫版本選擇。

若需動態列數(列名不固定),通常在應用層處理或使用動態 SQL 生成列,數據庫層面較複雜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved