mysql語法之case when then與列轉行


mysql語法中case when then與列轉行的使用場景非常豐富。

case語句類似java中條件分支語句的作用,可以類比java中的switch語句或者if語句來學習。

其語法如下:

case語句的語法:

轉換單個字段時:

case 字段 

when 字段值 then 返回值 

when 字段值 then 返回值

when 字段值 then 返回值

。。。。。。

else 默認值 end 別名;

 

當有多個字段需要轉換時:

case

when 字段名1=字段值11 and 字段名2=字段值2 and 。。。 then 返回值

when 字段名1=字段值12 and 字段名2=字段值3 and 。。。 then 返回值

when 字段名1=字段值13 and 字段名2=字段值4 and 。。。 then 返回值

when 字段名1=字段值14 and 字段名2=字段值5 and 。。。 then 返回值

。。。。。。

else 默認值 end 別名;

而列轉行則能夠幫我們把數據庫某些列轉換為行的形式展示給我們。

例如:

 

將上述結果進行列轉行可以得到如下結果:

 

列轉行語法:

sum(case when then else end) as 或者 max(case when then else end) as

 

創建一個數據庫stu,建立學生表,班級表,課程表,成績表

班級表包含班級id、班級名稱

創建班級表:

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `classes`;

CREATE TABLE `classes` (

  `cid` int(11) NOT NULL,

  `cname` varchar(10) DEFAULT NULL,

  PRIMARY KEY (`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

向班級表插入一個班級

INSERT INTO `classes` VALUES ('111', '一班');

 

課程表包含課程id、課程名稱

創建課程表:

DROP TABLE IF EXISTS `sc`;

CREATE TABLE `sc` (

  `scid` int(11) NOT NULL,

  `scname` varchar(10) DEFAULT NULL,

  PRIMARY KEY (`scid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

向課程表插入三門課程

INSERT INTO `sc` VALUES ('11', '語文');

INSERT INTO `sc` VALUES ('22', '數學');

INSERT INTO `sc` VALUES ('33', '英語');

 

成績表包含成績id、分數、分數所屬學生id、分數所屬課程id

創建成績表:

DROP TABLE IF EXISTS `score`;

CREATE TABLE `score` (

  `coid` int(11) NOT NULL,

  `score` int(8) DEFAULT NULL,

  `sid` int(11) DEFAULT NULL,

  `scid` int(11) DEFAULT NULL,

  PRIMARY KEY (`coid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

向成績表插入6條記錄:

INSERT INTO `score` VALUES ('1111', '90', '1', '11');

INSERT INTO `score` VALUES ('2222', '99', '1', '22');

INSERT INTO `score` VALUES ('3333', '89', '2', '11');

INSERT INTO `score` VALUES ('4444', '88', '2', '33');

INSERT INTO `score` VALUES ('5555', '75', '3', '22');

INSERT INTO `score` VALUES ('6666', '59', '3', '33');

 

學生表包含學生id、學生姓名、所屬班級id

創建學生表:

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

  `sid` int(11) NOT NULL,

  `sname` varchar(10) DEFAULT NULL,

  `cid` int(11) DEFAULT NULL,

  PRIMARY KEY (`sid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

向學生表插入三個學生:

INSERT INTO `student` VALUES ('1', '張三', '111');

INSERT INTO `student` VALUES ('2', '李四', '111');

INSERT INTO `student` VALUES ('3', '王五', '111');

 

 

查詢每個學生的姓名、所屬班級、所學課程、課程得分

SELECT
s.sname,
cl.cname,
sc.scname,
co.score
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid;

 

在上一個結果集的基礎上,將同一個學生的所有所學課程與所有分數分別以逗號形式連接成字符串:

SELECT
s.sname,
cl.cname,
GROUP_CONCAT(co.score) 分數,
GROUP_CONCAT(sc.scname) 課程
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;

 

 

列轉行實例:

SELECT
s.sname,
cl.cname,
IFNULL(
Max(
CASE sc.scname
WHEN '語文' THEN
co.score
END
),
'未選'
) AS '語文',
IFNULL(
Max(
CASE sc.scname
WHEN '數學' THEN
co.score
END
),
'未選'
) AS '數學',
IFNULL(
Max(
CASE sc.scname
WHEN '英語' THEN
co.score
END
),
'未選'
) AS '英語'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;

 

SELECT
s.sname,
cl.cname,
max(

IF (
sc.scname = '語文',
co.score ,- 1
)
) AS '語文',
max(

IF (
sc.scname = '數學',
co.score ,- 1
)
) AS '數學',
max(

IF (
sc.scname = '英語',
co.score ,- 1
)
) AS '英語'
FROM
student s,
classes cl,
sc,
score co
WHERE
s.cid = cl.cid
AND s.sid = co.sid
AND sc.scid = co.scid
GROUP BY
s.sname,
cl.cname;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM