一、不使用存儲過程的MySQL動態行轉列
MySQL動態行轉列是將行數據轉換為列數據的過程,將一個或多個欄位的值作為列名,對於每個值都新建一列,然後將行數據中對應的值插入到相應的列中。以下是不使用存儲過程的實現方法:
SELECT id, MAX(CASE name WHEN 'AAA' THEN value ELSE NULL END) AS AAA, MAX(CASE name WHEN 'BBB' THEN value ELSE NULL END) AS BBB, MAX(CASE name WHEN 'CCC' THEN value ELSE NULL END) AS CCC FROM table_name GROUP BY id;
其中,id 是行標識符,name是原表中的欄位名,value是要轉換的欄位值。以上就是一個簡單的 MySQL 動態行轉列實現的例子。
二、MySQL動態行轉列SQL
除了上面的實現方法外,我們也可以使用動態 SQL 的實現方式。這種方式需要先用 SELECT 語句查詢出所有的 name 值,並將它們 CONCAT 到字元串中。接著,我們就能生成一個包含所有列名的字元串用於後續的 SQL 語句中。以下示例代碼展示了如何使用 SQL 實現動態行轉列:
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN name = ''', name, ''' THEN value END) AS ', name) ) INTO @sql FROM table_name; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM table_name GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
三、MySQL動態列名
使用 MySQL 動態列名的方法可以達到效果相同,具有較好的可維護性。在 MySQL 中可以通過「information_schema」系統表獲得動態列名。以下是演示代碼:
SET @sql := ( SELECT CONCAT( 'SELECT id', GROUP_CONCAT( DISTINCT CONCAT(',MAX(IF(name="', name, '", value, NULL)) AS `', name, '`') ) ' FROM table_name GROUP BY id' ) FROM information_schema.COLUMNS WHERE TABLE_NAME = 'table_name' AND TABLE_SCHEMA = 'database_name' AND COLUMN_NAME NOT IN ('id', 'name') ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
四、MySQL動態行轉列的經典實現
除了上述的方法外,我們還有一種經典實現方法,即使用 GROUP_CONCAT 構建 SQL 語句並使用 PREPARE/EXECUTE 進行執行。
SET @sql = (SELECT GROUP_CONCAT( CONCAT('MAX(IF(`name` = "', `name`, '", `value`, "")) AS `', `name`, '`') ) FROM ( SELECT DISTINCT `name` FROM `table_name` ) AS `sub` ); SET @sql = CONCAT('SELECT `id`, ', @sql, ' FROM `table_name` GROUP BY `id`'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
五、MySQL行轉列SQL
MySQL 行轉列是行數據轉換為列數據的過程。轉換後的數據非常適合 Excel 的二維表數據表示,常用於報表、統計等場景中。以下是 MySQL 行轉列 SQL 語句的示例:
SELECT id, CASE WHEN name = 'AAA' THEN value END AS AAA, CASE WHEN name = 'BBB' THEN value END AS BBB, CASE WHEN name = 'CCC' THEN value END AS CCC FROM table_name;
六、MySQL動態行轉列函數
除了上述方法外,我們還可以使用動態行轉列函數。函數可以在複雜的數據轉換場景下減少代碼量。以下是 MySQL 動態行轉列函數的示例:
DELIMITER # CREATE FUNCTION dynamic_pivot (IN statement VARCHAR(64000)) RETURNS TEXT DETERMINISTIC BEGIN DECLARE pivot_query TEXT DEFAULT ''; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(if(`name` = ''', `name`, ''', `value`, null)) as ', `name` ) ) INTO @pivot_query FROM (SELECT `name` FROM table_name GROUP BY `name`) AS sub; SET pivot_query = CONCAT( 'SELECT `id`, ', @pivot_query, ' FROM table_name GROUP BY `id`' ); SET @query = CONCAT( 'SELECT GROUP_CONCAT(DISTINCT CONCAT(`', pivot_query, '`)) AS `pivot` FROM (', pivot_query, ') `base_query`' ); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; SELECT GROUP_CONCAT( DISTINCT CONCAT( 'CASE WHEN `name` = ''', `name`, ''' THEN `value` END AS `', `name`, '`' ) ) INTO @dynamic_query FROM (SELECT `name` FROM table_name GROUP BY `name`) AS `sub`; SET @dynamic_query = CONCAT( 'SELECT `id`,', @dynamic_query, ' FROM table_name GROUP BY `id`' ); SELECT concat('{ "pivot": "', pivot, '", "data": [',group_concat(row SEPARATOR ','),']}') INTO @result FROM (SELECT piv.*, @dynamic_query AS TO_ROW FROM (SELECT @query AS TO_PIVOT) t CROSS JOIN (SELECT @dynamic_query) r JOIN ( SELECT `id`, GROUP_CONCAT( CONCAT('MAX(IF(`name` = "', `name`, '", `value`, NULL))') ) AS to_select FROM `table_name` GROUP BY `id` ) f ON 1=1 JOIN (SELECT @rownum:=0) ii JOIN ( SELECT @rownum:=@rownum+1 AS row, al.* FROM (SELECT * FROM table_name ORDER BY `id`, `name`) al ) piv ON f.to_select LIKE CONCAT('%', `piv`.`name`, '%') ) all_queries; RETURN SUBSTRING(@result,2,LENGTH(@result)-2); END# DELIMITER ;
七、MySQL行轉列經典實現
我們還可以使用經典實現方法來進行 MySQL 行轉列。在經典實現方法中,我們使用 CASE WHEN 條件語句將單個行轉換為多個列。以下是 MySQL 行轉列經典實現的示例:
SELECT id, MAX(CASE name WHEN 'AAA' THEN value ELSE NULL END) AS AAA, MAX(CASE name WHEN 'BBB' THEN value ELSE NULL END) AS BBB, MAX(CASE name WHEN 'CCC' THEN value ELSE NULL END) AS CCC FROM table_name GROUP BY id;
八、MySQL怎麼行轉列
MySQL 行轉列是一種將行數據轉換為列數據的過程。它支持多種實現方法,包括使用 SQL 語句、使用動態 SQL、使用存儲過程等等。我們可以根據實際情況選擇適合自己的方法來實現行轉列。以上的方法均可經過改造實現行轉列。
九、MySQL動態列轉行
除了行轉列,我們還可以使用 MySQL 動態列轉行。該方法可以將一種表示形式轉變為另一種表示形式,將列轉換為行。以下是 MySQL 動態列轉行的 SQL 語句示例:
SELECT `id`, CONCAT_WS(', ', COALESCE(`AAA`, NULL), COALESCE(`BBB`, NULL), COALESCE(`CCC`, NULL)) AS `values` FROM `table_name`;
十、SQL行轉列三種方式
MySQL 行轉列是將行數據轉換為列數據的過程。常用於報表、統計等場景中。除了 MySQL 之外,還有其他資料庫也支持行轉列功能。以下是 SQL 行轉列實現的三種方便方式:
- 使用 SQL CASE WHEN 語句轉換行為列。
- 使用 SQL PIVOT 語句轉換行為列。
- 使用 SQL 特有的行轉列函數。
以上三種方式均非常簡單、易於使用。
以上介紹了 MySQL 動態行轉列的多種實現方式,包括不使用存儲過程的 MySQL 動態行轉列、MySQL 動態行轉列 SQL、MySQL 動態列名、MySQL 行轉列經典實現、MySQL 行轉列 SQL、MySQL 行轉列函數、MySQL 行轉列經典實現、MySQL 怎麼行轉列、MySQL 動態列轉行、SQL 行轉列三種方式。通過這些方法,我們可以輕鬆地實現 MySQL 行列轉換。具體選擇哪種方法,可以根據實際需求進行選擇。
原創文章,作者:VXRP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136081.html