源數據:
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
-- 準備測試表
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 表達式。