MySQL實(shí)現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼
引言
在處理數(shù)據(jù)時(shí),我們常常會(huì)遇到需要將表中的列(字段)轉(zhuǎn)換為行,或?qū)⑿修D(zhuǎn)換為列的情況。這種操作通常被稱為“列轉(zhuǎn)行”(Pivoting)和“行轉(zhuǎn)列”(Unpivoting)。在 MySQL 中,雖然沒有直接提供 PIVOT 和 UNPIVOT 這樣的關(guān)鍵字,但我們可以使用其他方法來實(shí)現(xiàn)這些功能。本文將向您介紹如何使用 CASE 語句、聚合函數(shù)以及 GROUP BY 子句來完成列轉(zhuǎn)行和行轉(zhuǎn)列的操作。
列轉(zhuǎn)行(Pivoting)
列轉(zhuǎn)行是指將表格中的一列或多列的值轉(zhuǎn)換成新的列標(biāo)題,并且將對應(yīng)的數(shù)據(jù)填充到這些新列中。下面通過一個(gè)例子來說明這個(gè)過程。
示例數(shù)據(jù)
假設(shè)有一個(gè)成績表 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)行的逆過程,即將多個(gè)列的數(shù)據(jù)轉(zhuǎn)換成一行多條記錄的形式。這可以通過 UNION ALL 來實(shí)現(xiàn)。
示例數(shù)據(jù)
假設(shè)現(xiàn)在有另一個(gè)表 students,它已經(jīng)以列轉(zhuǎn)行后的形式存儲(chǔ)了學(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 語句
我們將每個(gè)科目的成績都變成單獨(dú)的一行記錄。
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實(shí)現(xiàn)列轉(zhuǎn)行與行轉(zhuǎn)列的操作代碼的文章就介紹到這了,更多相關(guān)MySQL列轉(zhuǎn)行與行轉(zhuǎn)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解
今天小編就為大家分享一篇關(guān)于MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
mysql服務(wù)1067錯(cuò)誤多種解決方案分享
今天我的mysql服務(wù)器突然出來了1067錯(cuò)誤提示,無法正常啟動(dòng)了,我今天從網(wǎng)上找尋了大量的解決mysql服務(wù)1067錯(cuò)誤的辦法,有需要的朋友可以看看2012-03-03
mysql數(shù)據(jù)庫修改數(shù)據(jù)表引擎的方法
對于MySQL數(shù)據(jù)庫,如果你要使用事務(wù)以及行級(jí)鎖就必須使用INNODB引擎。如果你要使用全文索引,那必須使用myisam,那如何修改修改MySQL的引擎為INNODB呢,下面介紹一個(gè)修改方法2014-01-01
MySQL高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn)
這篇文章主要介紹了MySQL高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
淺析MySQL內(nèi)存的使用說明(全局緩存+線程緩存)
本篇文章是對MySQL內(nèi)存的使用說明(全局緩存+線程緩存)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
用VirtualBox構(gòu)建MySQL測試環(huán)境的筆記
這篇文章主要介紹了如何用VirtualBox構(gòu)建MySQL測試環(huán)境,特分享下,方便需要的朋友2013-08-08

