SQL行列轉(zhuǎn)換超詳細(xì)四種方法詳解
前言
本文詳細(xì)的介紹了多個(gè)方法實(shí)現(xiàn)列轉(zhuǎn)行,行轉(zhuǎn)列,并提供了案例的材料,有需要的小伙伴可以自行獲取與學(xué)習(xí)~
數(shù)據(jù)準(zhǔn)備
CREATE TABLE `score` ( `id` varchar(255), `subject` char(10), `score` int ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `score`(`id`,`subject`,`score`) values ('1','MATH',90),('1','ENGLISH',98),('1','CHINESE',85),('2','MATH',87),('2','ENGLISH',78),('2','CHINESE',89);

1.使用join拼接
SELECT id,score as 'MATH' FROM score WHERE subject = 'MATH';
我們把其他幾門科目的成績(jī)查出來(lái)后當(dāng)做臨時(shí)表再使用join不就解決了該問(wèn)題嗎?!而連接條件便是std??吹竭@,大家可以自己試一試。完整代碼如下:
SELECT * FROM ( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1 JOIN ( SELECT id, score FROM score WHERE subject = 'ENGLISH' ) AS t2 ON t1.id = t2.id JOIN ( SELECT id, score FROM score WHERE subject = 'CHINESE' ) AS t3 ON t1.id = t3.id

然后我們只需要對(duì)上述的結(jié)果,挑選出我們想要的數(shù)據(jù)即可
SELECT t1.id, t1.MATH, t2.score AS 'ENGLISH',t3.score AS 'CHINESE' FROM ( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1 JOIN ( SELECT id, score FROM score WHERE subject = 'ENGLISH' ) AS t2 ON t1.id = t2.id JOIN ( SELECT id, score FROM score WHERE subject = 'CHINESE' ) AS t3 ON t1.id = t3.id

2.自然拼接
自動(dòng)的尋找2表中的(所有)同名且屬性相同的列作為連接條件。使用natural join子句來(lái)完成。
例如:A表中有列a,b,c,d B表中有a,b,x,z
自然連接會(huì)將A.a=B.a and A.b=B.b 作為連接條件
select * from A natural join B (natural 不可以省略)。他們所得的結(jié)果中,同名且屬性相同的字段只顯示一個(gè)。
對(duì)于自然連接而言,連接兩個(gè)table之后,兩個(gè)table共用的屬性就會(huì)合并在一起。如果連個(gè)table沒(méi)有共有的屬性,則進(jìn)行笛卡爾乘積,也就是進(jìn)行兩兩相乘,如果table 1有3行,table 2有4行,自然連接后就有12行。自然連接的語(yǔ)法如下:
SELECT * FROM ( SELECT id, score AS 'MATH' FROM score WHERE subject = 'MATH' ) AS t1 NATURAL JOIN ( SELECT id, score AS 'ENGLISH' FROM score WHERE SUBJECT = 'ENGLISH' ) AS t2 NATURAL JOIN ( SELECT id, score AS 'CHINESE' FROM score WHERE SUBJECT = 'CHINESE' ) AS t3
???? ????????????
3.使用union拼接
union:會(huì)將兩個(gè)結(jié)果集進(jìn)行并集處理,不包括重復(fù)的行;
union all:對(duì)兩個(gè)結(jié)果集進(jìn)行并集處理,包括重復(fù)行。
日常開發(fā)中,能使用union all就使用union all
SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH';

(SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH') UNION ALL (SELECT id,0 AS 'MATH',score AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'ENGLISH') UNION ALL (SELECT id,0 AS 'MATH',0 AS 'ENGLISH',score AS 'CHINESE' FROM score WHERE subject = 'CHINESE');

此時(shí),我們發(fā)現(xiàn)目前的sql查詢出來(lái)會(huì)有很多重復(fù)的行,但由于其他科目沒(méi)有的數(shù)據(jù)都是0,我們可以根據(jù)id進(jìn)行分組,然后sum()聚合相加一下,這樣就能得到我們想要的結(jié)果
select id,SUM(MATH) AS 'MATH',SUM(ENGLISH) AS 'ENGLISH',SUM(CHINESE)AS CHINESE from ( (SELECT id,score AS 'MATH',0 AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'MATH') UNION ALL (SELECT id,0 AS 'MATH',score AS 'ENGLISH',0 AS 'CHINESE' FROM score WHERE subject = 'ENGLISH') UNION ALL (SELECT id,0 AS 'MATH',0 AS 'ENGLISH',score AS 'CHINESE' FROM score WHERE subject = 'CHINESE')) t GROUP BY id
以上都是列轉(zhuǎn)行,反過(guò)來(lái)思路也大致一樣就可以實(shí)現(xiàn)從行轉(zhuǎn)列
SELECT id, 'MATH' subject, MATH score FROM products WHERE MATH IS NOT NULL UNION SELECT id, 'ENGLISH' subject, ENGLISH score FROM products WHERE ENGLISH IS NOT NULL UNION SELECT id, 'CHINESE' subject, CHINESE score FROM products WHERE CHINESE IS NOT NULL;
4.經(jīng)典sum+if
思路:由多行變?yōu)橐恍?,自然而然的就要想要?duì)id進(jìn)行g(shù)roupby聚合,在此基礎(chǔ)上,我們還需要根據(jù)課程名詞去篩選課程成績(jī),因此還需要再添加一個(gè)if函數(shù)作為篩選(用case when)也可以,如果if符合條件,就設(shè)置本課程的分?jǐn)?shù),如果不符合條件,就設(shè)置為null,最后我們?cè)偻ㄟ^(guò)一個(gè)sum聚合函數(shù)提取成績(jī)即可
SELECT id,
if(subject='MATH', score, NULL) as `MATH`,
if(subject='ENGLISH', score, NULL) as `ENGLISH`,
if(subject='CHINESE', score, NULL) as `CHINESE`
FROM score

該步驟與上面union中自己設(shè)置0有異曲同工之妙,只不過(guò)這一次是通過(guò)if判斷自動(dòng)的設(shè)置為null,我們只需要在此基礎(chǔ)上,對(duì)id進(jìn)行分組,再添加一個(gè)sum聚合一下就可以實(shí)現(xiàn)我們的需求
SELECT id,
sum(if(subject='MATH', score, NULL)) as `MATH`,
sum(if(subject='ENGLISH', score, NULL)) as `ENGLISH`,
sum(if(subject='CHINESE', score, NULL)) as `CHINESE`
FROM score
GROUP BY id

總結(jié)
到此這篇關(guān)于SQL行列轉(zhuǎn)換超詳細(xì)四種方法的文章就介紹到這了,更多相關(guān)SQL行列轉(zhuǎn)換方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- sql 普通行列轉(zhuǎn)換
- 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語(yǔ)句
- sqlserver2005 行列轉(zhuǎn)換實(shí)現(xiàn)方法
- Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
- 玩轉(zhuǎn)-SQL2005數(shù)據(jù)庫(kù)行列轉(zhuǎn)換
- 深入SQL中PIVOT 行列轉(zhuǎn)換詳解
- PostgreSQL實(shí)現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例
- sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
- SQL Server 使用 Pivot 和 UnPivot 實(shí)現(xiàn)行列轉(zhuǎn)換的問(wèn)題小結(jié)
- SQL Server使用PIVOT與unPIVOT實(shí)現(xiàn)行列轉(zhuǎn)換
- MySQL實(shí)現(xiàn)行列轉(zhuǎn)換
- SQL Server行列轉(zhuǎn)換的實(shí)現(xiàn)示例
- SQLServer使用 PIVOT 和 UNPIVOT行列轉(zhuǎn)換
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)增量備份的思路和方法
MySQL數(shù)據(jù)庫(kù)增量備份,在這之前修改我們的數(shù)據(jù)庫(kù)配置文件/etc/my.cnf開啟bin-log日志功能即可,下面小編給大家分享Mysql數(shù)據(jù)庫(kù)增量備份的思路詳解,一起看看吧2017-09-09
Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用)
本文主要給大家介紹Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用),涉及到mysql數(shù)據(jù)庫(kù)相關(guān)知識(shí),對(duì)mysql數(shù)據(jù)庫(kù)分庫(kù)分表相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03
MySQL錯(cuò)誤Forcing close of thread的兩種解決方法
這篇文章主要介紹了MySQL錯(cuò)誤Forcing close of thread的兩種解決方法,需要的朋友可以參考下2014-11-11
MySQL系列關(guān)于NUll值的經(jīng)驗(yàn)總結(jié)分析教程
這篇文章主要為大家介紹了MySQL系列關(guān)于NUll值的一些經(jīng)驗(yàn)總結(jié)分析,關(guān)于null值的影響作用以及為什么會(huì)出現(xiàn)null值的原因等等問(wèn)題的解析2021-10-10

