MySQL 列轉行函數全方位解析

一、概述

MySQL 列轉行函數(Pivot 轉換或數據透視)是將列中的數據轉換成行的形式,可以在大量數據分析中用於數據聚合。在 MySQL 中,有三種方法可以實現列轉行功能:

  • 使用 CASE WHEN 語句
  • 使用 GROUP_CONCAT 函數
  • 使用 UNION ALL 語句

本文將詳細介紹這三種方法的原理和實現步驟。

二、使用 CASE WHEN 語句

使用 CASE WHEN 語句是實現列轉行功能最常見的方法。其原理是將每個需要轉置的列都分別用 CASE WHEN 語句進行處理,將所有處理後的結果用 UNION ALL 連接起來。

下面是一個例子:

SELECT id, 
    MAX(CASE WHEN subject = 'math' THEN score ELSE NULL END) AS math, 
    MAX(CASE WHEN subject = 'english' THEN score ELSE NULL END) AS english, 
    MAX(CASE WHEN subject = 'history' THEN score ELSE NULL END) AS history 
FROM scores
GROUP BY id;

以上代碼將 scores 表中的 id、subject 和 score 三個字段進行列轉行,其結果將會是以下形式:

+------+----------+---------+---------+
| id   | math     | english | history |
+------+----------+---------+---------+
| 1    | 80       | 90      | 85      |
| 2    | 75       | 85      | 90      |
| 3    | 95       | 92      | 80      |
+------+----------+---------+---------+

以上代碼使用了 MAX 函數,因為涉及到多個 CASE WHEN 語句,每個語句只有一條記錄會生效,其他記錄為 NULL。因此,可以使用 MAX 函數來將有效記錄取出。

三、使用 GROUP_CONCAT 函數

GROUP_CONCAT 函數是用於將多行記錄轉換成單行記錄字符串的函數。使用該函數實現列轉行功能的原理是將每個需要轉置的數據分別使用聚合函數和 GROUP BY 語句進行處理,並將結果通過 GROUP_CONCAT 函數連接起來。

下面是一個例子:

SELECT id, 
    GROUP_CONCAT(CASE WHEN subject = 'math' THEN score ELSE NULL END) AS math, 
    GROUP_CONCAT(CASE WHEN subject = 'english' THEN score ELSE NULL END) AS english, 
    GROUP_CONCAT(CASE WHEN subject = 'history' THEN score ELSE NULL END) AS history 
FROM scores
GROUP BY id;

以上代碼得到的結果與使用 CASE WHEN 語句的結果相同。但是,使用 GROUP_CONCAT 函數時需要注意被連接的字符串可能會超出 MySQL 默認配置的長度限制,因此需要事先進行調整。

四、使用 UNION ALL 語句

使用 UNION ALL 語句實現列轉行功能的原理是將所有需要轉置的列都分別作為子查詢,並在最外層使用 UNION ALL 連接起來。

下面是一個例子:

SELECT id, 'math' AS subject, math AS score FROM scores 
UNION ALL
SELECT id, 'english' AS subject, english AS score FROM scores 
UNION ALL
SELECT id, 'history' AS subject, history AS score FROM scores 
ORDER BY id, subject;

以上代碼得到的結果與使用前兩種方法的結果相同。但是,由於需要多次查詢,因此性能相對較差,適用於數據量比較小的情況。

五、注意事項

在使用列轉行函數時,需要注意以下幾點:

  • 需要將轉置後的數據進行聚合,因此需要使用 GROUP BY 語句。
  • 需要處理的字段需要在 GROUP BY 語句中出現。
  • 使用 CASE WHEN 語句時,需要每個需要轉置的字段都使用一個 CASE WHEN 語句進行處理。
  • 使用 GROUP_CONCAT 函數時,需要將需要連接的字符串進行長度控制。

六、總結

MySQL 列轉行函數是一種將列數據轉換成行數據的常用方法。在 MySQL 中,主要有三種方法可以實現列轉行功能:使用 CASE WHEN 語句、使用 GROUP_CONCAT 函數和使用 UNION ALL 連接多個子查詢。使用列轉行函數時,需要注意需要轉換的字段出現在 GROUP BY 語句中,同時使用 MAX 函數或 GROUP_CONCAT 函數選擇要取出的有效記錄。為了避免字符串長度超出 MySQL 默認配置的限制,使用 GROUP_CONCAT 函數時需要事先進行長度控制。

原創文章,作者:FTVH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/136363.html

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

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何修改mysql的端口號

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

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論