MySQL實現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼
引言
在處理數(shù)據(jù)時,我們常常會遇到需要將表中的列(字段)轉(zhuǎn)換為行,或?qū)⑿修D(zhuǎn)換為列的情況。這種操作通常被稱為“列轉(zhuǎn)行”(Pivoting)和“行轉(zhuǎn)列”(Unpivoting)。在 MySQL 中,雖然沒有直接提供 PIVOT 和 UNPIVOT 這樣的關(guān)鍵字,但我們可以使用其他方法來實現(xiàn)這些功能。本文將向您介紹如何使用 CASE 語句、聚合函數(shù)以及 GROUP BY 子句來完成列轉(zhuǎn)行和行轉(zhuǎn)列的操作。
列轉(zhuǎn)行(Pivoting)
列轉(zhuǎn)行是指將表格中的一列或多列的值轉(zhuǎn)換成新的列標(biāo)題,并且將對應(yīng)的數(shù)據(jù)填充到這些新列中。下面通過一個例子來說明這個過程。
示例數(shù)據(jù)
假設(shè)有一個成績表 scores
,包含學(xué)生的姓名 name
、科目 subject
和分?jǐn)?shù) score
:
CREATE TABLE scores ( name VARCHAR(50), subject VARCHAR(20), score INT ); INSERT INTO scores (name, subject, score) VALUES ('Alice', 'Math', 95), ('Alice', 'English', 88), ('Bob', 'Math', 76), ('Bob', 'English', 92);
轉(zhuǎn)換前查詢結(jié)果
SELECT * FROM scores; +-------+---------+-------+ | name | subject | score | +-------+---------+-------+ | Alice | Math | 95 | | Alice | English | 88 | | Bob | Math | 76 | | Bob | English | 92 | +-------+---------+-------+
列轉(zhuǎn)行 SQL 語句
我們需要將 subject
列的不同值變?yōu)樾碌牧忻?,并把對?yīng)的 score
填充進(jìn)去。
SELECT name, MAX(CASE WHEN subject = 'Math' THEN score ELSE NULL END) AS Math, MAX(CASE WHEN subject = 'English' THEN score ELSE NULL END) AS English FROM scores GROUP BY name;
轉(zhuǎn)換后查詢結(jié)果
+-------+------+---------+ | name | Math | English | +-------+------+---------+ | Alice | 95 | 88 | | Bob | 76 | 92 | +-------+------+---------+
行轉(zhuǎn)列(Unpivoting)
行轉(zhuǎn)列是列轉(zhuǎn)行的逆過程,即將多個列的數(shù)據(jù)轉(zhuǎn)換成一行多條記錄的形式。這可以通過 UNION ALL 來實現(xiàn)。
示例數(shù)據(jù)
假設(shè)現(xiàn)在有另一個表 students
,它已經(jīng)以列轉(zhuǎn)行后的形式存儲了學(xué)生的信息:
CREATE TABLE students ( name VARCHAR(50), Math INT, English INT ); INSERT INTO students (name, Math, English) VALUES ('Alice', 95, 88), ('Bob', 76, 92);
轉(zhuǎn)換前查詢結(jié)果
SELECT * FROM students; +-------+------+---------+ | name | Math | English | +-------+------+---------+ | Alice | 95 | 88 | | Bob | 76 | 92 | +-------+------+---------+
行轉(zhuǎn)列 SQL 語句
我們將每個科目的成績都變成單獨的一行記錄。
SELECT name, 'Math' AS subject, Math AS score FROM students UNION ALL SELECT name, 'English' AS subject, English AS score FROM students;
轉(zhuǎn)換后查詢結(jié)果
+-------+---------+-------+ | name | subject | score | +-------+---------+-------+ | Alice | Math | 95 | | Bob | Math | 76 | | Alice | English | 88 | | Bob | English | 92 | +-------+---------+-------+
通過以上示例,我們可以看到如何在 MySQL 中靈活地進(jìn)行列轉(zhuǎn)行和行轉(zhuǎn)列的數(shù)據(jù)轉(zhuǎn)換。希望這些技巧能夠幫助您更好地管理和分析數(shù)據(jù)庫中的數(shù)據(jù)。
到此這篇關(guān)于MySQL實現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼的文章就介紹到這了,更多相關(guān)MySQL列轉(zhuǎn)行與行轉(zhuǎn)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
故障的機(jī)器修好后重啟,狂拉主庫binlog,導(dǎo)致網(wǎng)絡(luò)問題的解決方法
本文主要記錄一次簡單的、典型的故障,發(fā)生問題的原因很簡單,這個問題發(fā)生也很簡單,各位同學(xué)一定要注意,一不留神就會對主庫造成影響2016-04-04mysql 數(shù)據(jù)庫備份和還原方法集錦 推薦
本文討論 MySQL 的備份和恢復(fù)機(jī)制,以及如何維護(hù)數(shù)據(jù)表,包括最主要的兩種表類型:MyISAM 和 Innodb,文中設(shè)計的 MySQL 版本為 5.0.22。2010-03-03解決MySQL啟動報錯:ERROR 2003 (HY000): Can''t connect to MySQL serv
這篇文章主要介紹了解決MySQL啟動報錯:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061),本文解釋了如何解決該問題,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07