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

MySQL 行轉列:一個 ID 多行數據合併為一行多列(動態 SQL)

     編輯:程式設計疑難解答

源數據:

ID  SEG  MMM  NNN
123 1    A    AA
123 2    B    BB
123 3    C    CC

目標:

ID  MMM_1  NNN_1  MMM_2  NNN_2  MMM_3  NNN_3
123 A      AA     B      BB     C      CC

動態 SQL 實現(MySQL 8.0+)

-- 準備測試表
CREATE TEMPORARY TABLE Tmp (ID INT, SEG INT, MMM VARCHAR(10), NNN VARCHAR(10));
INSERT INTO Tmp VALUES (123,1,'A','AA'),(123,2,'B','BB'),(123,3,'C','CC');

-- 生成列選擇片段
SET @sql = '';
SELECT GROUP_CONCAT(
    CONCAT('MAX(CASE WHEN SEG=', SEG, ' THEN MMM END) AS `MMM_', SEG, '`',
           ',MAX(CASE WHEN SEG=', SEG, ' THEN NNN END) AS `NNN_', SEG, '`')
) INTO @sql FROM Tmp;

-- 拼裝完整查詢
SET @sql = CONCAT('SELECT ID, ', @sql, ' FROM Tmp GROUP BY ID');

-- 執行
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

原理

  • CASE WHEN SEG=n THEN MMM END 提取特定段的值,其他行為 NULL。
  • MAX 聚合去 NULL,得到該段的值。
  • GROUP_CONCAT 動態拼接所有段的列表達式。
  • PREPARE/EXECUTE 執行動態生成的 SQL。

適用於段數不固定、需自適應的場景。固定段數可直接寫死 CASE 表達式。

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