MySQL動態行轉列的實現方法

一、不使用存儲過程的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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VXRP的頭像VXRP
上一篇 2024-10-04 00:15
下一篇 2024-10-04 00:15

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • QML 動態載入實踐

    探討 QML 框架下動態載入實現的方法和技巧。 一、實現動態載入的方法 QML 支持從 JavaScript 中動態指定需要載入的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29

發表回復

登錄後才能評論