MySQL是一款常用的開源數(shù)據(jù)庫,具有性能較高、使用方便等優(yōu)點(diǎn)。在MySQL中,常常會(huì)遇到需要進(jìn)行列行轉(zhuǎn)換的情況。下面我們來介紹一下如何實(shí)現(xiàn)MySQL的列行轉(zhuǎn)換。
在MySQL中,我們可以使用UNION ALL操作實(shí)現(xiàn)行轉(zhuǎn)列,使用CASE WHEN操作實(shí)現(xiàn)列轉(zhuǎn)行。兩者均需要使用到MySQL中的聚合函數(shù)和動(dòng)態(tài)SQL。
首先,讓我們來看一下如何使用UNION ALL操作進(jìn)行行轉(zhuǎn)列。假設(shè)有一張表students,其中包含學(xué)生的姓名、科目以及對(duì)應(yīng)的分?jǐn)?shù):
CREATE TABLE students ( `name` VARCHAR(20), `subject` VARCHAR(20), `score` INT ); INSERT INTO students VALUES ('張三', '語文', 90), ('張三', '數(shù)學(xué)', 95), ('李四', '語文', 88), ('李四', '數(shù)學(xué)', 92);
現(xiàn)在我們想要將這張表轉(zhuǎn)換為按照學(xué)生姓名為列名,科目為行名,對(duì)應(yīng)的分?jǐn)?shù)為值的表格。可以使用如下代碼實(shí)現(xiàn):
SELECT subject, MAX(CASE WHEN name='張三' THEN score ELSE NULL END) 張三, MAX(CASE WHEN name='李四' THEN score ELSE NULL END) 李四 FROM students GROUP BY subject;
在這個(gè)代碼中,我們使用了MAX函數(shù),因?yàn)閷?duì)于一個(gè)科目,每個(gè)學(xué)生只會(huì)有一條記錄。同時(shí),我們使用CASE WHEN語句動(dòng)態(tài)生成列名,將分?jǐn)?shù)填充到對(duì)應(yīng)位置。其中,當(dāng)條件不滿足時(shí),我們將填充NULL值。
接下來,讓我們來看一下如何使用CASE WHEN操作進(jìn)行列轉(zhuǎn)行。假設(shè)有一張表old,其中包含編號(hào)、名稱以及器材1、器材2、器材3三種器材的數(shù)量:
CREATE TABLE old ( `id` INT, `name` VARCHAR(20), `equipment1` INT, `equipment2` INT, `equipment3` INT ); INSERT INTO old VALUES (1, 'A', 2, 3, 4), (2, 'B', 3, 5, 6), (3, 'C', 7, 8, 9);
現(xiàn)在我們想要將這張表轉(zhuǎn)換為按照編號(hào)、名稱、器材、數(shù)量的表格。可以使用如下代碼實(shí)現(xiàn):
SELECT id, name, 'equipment1' AS equipment, equipment1 AS quantity FROM old UNION ALL SELECT id, name, 'equipment2' AS equipment, equipment2 AS quantity FROM old UNION ALL SELECT id, name, 'equipment3' AS equipment, equipment3 AS quantity FROM old;
在這段代碼中,我們使用UNION ALL操作將三個(gè)子查詢合并為一個(gè)結(jié)果集。每個(gè)子查詢都類似于之前行轉(zhuǎn)列的示例,使用CASE WHEN語句動(dòng)態(tài)生成列名,并將對(duì)應(yīng)的數(shù)量填充到每一條記錄中。
通過以上兩個(gè)示例,我們可以看到,在MySQL中,實(shí)現(xiàn)列行轉(zhuǎn)換可以使用聚合函數(shù)、動(dòng)態(tài)SQL以及UNION ALL和CASE WHEN等操作。