MYSQL行列轉(zhuǎn)置方式
MYSQL行列轉(zhuǎn)置
環(huán)境準備:mysql,navicat
本文講解列轉(zhuǎn)行:
數(shù)據(jù)庫是這樣顯示的
想要轉(zhuǎn)換成下面這樣顯示
開始列轉(zhuǎn)行之前的準備
準備1:創(chuàng)建表學(xué)生分數(shù)表grade
CREATE TABLE grade ( stuName VARCHAR(20) NOT NULL COMMENT '學(xué)生姓名', stuCourse VARCHAR(20) NOT NULL COMMENT '學(xué)生課程名', stuScore INT NOT NULL COMMENT '學(xué)生課程分數(shù)' )
grade表創(chuàng)建好了,也可以直接navicat數(shù)據(jù)庫右鍵鼠標(biāo)建表
鼠標(biāo)右鍵單擊grade設(shè)計表查看表結(jié)構(gòu)設(shè)置,結(jié)果與sql語句設(shè)置一致繼續(xù)往下走
準備2:往分數(shù)表grade插入多條數(shù)據(jù)
INSERT INTO grade(stuName,stuCourse,stuScore) VALUES ('張三','語文',110), ('張三','數(shù)學(xué)',130), ('張三','英語',60), ('張三','體育',40), ('李四','語文',108), ('李四','數(shù)學(xué)',145), ('李四','英語',28), ('李四','體育',48), ('王五','語文',120), ('王五','數(shù)學(xué)',99), ('王五','英語',140), ('王五','體育',42)
鼠標(biāo)雙擊grade查看數(shù)據(jù)是否已插入,OK
下面開始步入正題
步驟一:查詢表內(nèi)所有數(shù)據(jù)(注釋:'*'代表所有)
SELECT * FROM grade
查詢結(jié)果顯然不符合我們的預(yù)期
步驟二修改查詢的sql語句
- 方式一:CASE
CASE case_value WHEN when_value THEN statement_list ELSE statement_list END CASE;
具體代碼
SELECT stuName, SUM(CASE WHEN stuCourse='語文' THEN stuScore ELSE 0 END) AS '語文', SUM(CASE WHEN stuCourse='數(shù)學(xué)' THEN stuScore ELSE 0 END) AS '數(shù)學(xué)', SUM(CASE WHEN stuCourse='英語' THEN stuScore ELSE 0 END) AS '英語', SUM(CASE WHEN stuCourse='體育' THEN stuScore ELSE 0 END) AS '體育', SUM(stuScore) AS '學(xué)科總分' FROM grade GROUP BY stuName
以下為代碼注釋:
//SELECT 后跟查詢結(jié)果 SELECT stuName, //SUM 聚合函數(shù)(官方寫好求和用的) // CASE WHEN stuCourse='語文' THEN stuScore ELSE 0 END 用于替換值 若stuCourse='語文' 則對應(yīng)顯示stuScore,否則顯示0 //AS 重命名 列/(也叫字段)名 SUM(CASE WHEN stuCourse='語文' THEN stuScore ELSE 0 END) AS '語文', SUM(CASE WHEN stuCourse='數(shù)學(xué)' THEN stuScore ELSE 0 END) AS '數(shù)學(xué)', SUM(CASE WHEN stuCourse='英語' THEN stuScore ELSE 0 END) AS '英語', SUM(CASE WHEN stuCourse='體育' THEN stuScore ELSE 0 END) AS '體育', //SUM(stuScore)求各個學(xué)科總分數(shù) SUM(stuScore) AS '學(xué)科總分' //from 后跟要查詢的表名 FROM grade //GROUP BY 對stuName進行分組,沒有這句,會報錯,要不然,就是顯示第一行 GROUP BY stuName
查詢結(jié)果,符合預(yù)期,列轉(zhuǎn)行成功
- 方式二:if
IF(expr1,expr2,expr3)
具體代碼
SELECT stuName, SUM(IF(stuCourse='語文',stuScore,0)) AS '語文', SUM(IF(stuCourse='數(shù)學(xué)',stuScore,0)) AS '數(shù)學(xué)', SUM(IF(stuCourse='英語',stuScore,0)) AS '英語', SUM(IF(stuCourse='體育',stuScore,0)) AS '體育', SUM(stuScore) AS '學(xué)科總分' FROM grade GROUP BY stuName
效果和方式一是一樣的
小節(jié):
1.這里面的SUM可以換成MAX,MIN,AVG等等,因為各個字段如stuCourse對應(yīng)一個stuScore所以用哪個都一樣
2.當(dāng)普通字段如stuName與聚合函數(shù)SUM(stuScore)一起查詢時 stuName,SUM(字段)
必須要分組,GROUP BY stuName
不然會報錯!??!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL控制流函數(shù)(-if?,elseif,else,case...when)
這篇文章主要介紹了MySQL控制流函數(shù)(-if?,elseif,else,case...when),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07mysql特殊語法insert?into?..?on?duplicate?key?update?..使用方
在我們的日常開發(fā)中經(jīng)常會遇到過這樣的情景,查看某條記錄是否存在,不存在的話創(chuàng)建一條新記錄,存在的話更新某些字段,下面這篇文章主要給大家介紹了關(guān)于mysql特殊語法insert?into?..?on?duplicate?key?update?..使用方法的相關(guān)資料,需要的朋友可以參考下2023-04-04