在MySQL 中動態地將行轉換為具有多個條件的列
問題:
如何我根據兩個條件動態地將MySQL 中的行轉換為列,由兩個表示列?
上下文:
表格包含多行,每行包含名為「資料」和「價格」的欄位。目標是將表格轉換為新表格,其中的欄位代表資料和價格的唯一組合,每個儲存格包含對應的行資料。
解:
為了根據多個條件動態地將行轉換為列,我們可以結合使用 MySQL函數與動態SQL.
首先,我們逆透視原始表,為每個唯一的資料組合建立一個包含多行的新表格和價格。
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
接下來,我們使用 CASE 語句將未透視的資料聚合回列中。
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
為了使查詢動態化,我們使用準備好的語句並動態產生基於原始表中唯一列的CASE 語句。
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
此動態查詢處理任意數量的唯一條件並產生所需的轉換表。
以上是如何根據多個條件動態地將 MySQL 中的行轉換為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!