MySQL行轉列經典案例
阿新 • • 發佈:2018-11-21
準備資料表
/* Navicat MySQL Data Transfer Source Server : MyDB Source Server Version : 50720 Source Host : localhost:3306 Source Database : student Target Server Type : MYSQL Target Server Version : 50720 File Encoding : 65001 Date: 2018-11-01 16:08:27 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for courses -- ---------------------------- DROP TABLE IF EXISTS `courses`; CREATE TABLE `courses` ( `courseno` varchar(20) NOT NULL, `coursenm` varchar(100) NOT NULL, PRIMARY KEY (`courseno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='課程表'; -- ---------------------------- -- Records of courses -- ---------------------------- INSERT INTO `courses` VALUES ('C001', '大學語文'); INSERT INTO `courses` VALUES ('C002', '新視野英語'); INSERT INTO `courses` VALUES ('C003', '離散數學'); INSERT INTO `courses` VALUES ('C004', '概率論與數理統計'); INSERT INTO `courses` VALUES ('C005', '線性代數'); INSERT INTO `courses` VALUES ('C006', '高等數學(一)'); INSERT INTO `courses` VALUES ('C007', '高等數學(二)'); -- ---------------------------- -- Table structure for score -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` ( `stuid` varchar(16) NOT NULL, `courseno` varchar(20) NOT NULL, `scores` float DEFAULT NULL, PRIMARY KEY (`stuid`,`courseno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES ('1001', 'C001', '67'); INSERT INTO `score` VALUES ('1001', 'C002', '87'); INSERT INTO `score` VALUES ('1001', 'C003', '83'); INSERT INTO `score` VALUES ('1001', 'C004', '88'); INSERT INTO `score` VALUES ('1001', 'C005', '77'); INSERT INTO `score` VALUES ('1002', 'C001', '68'); INSERT INTO `score` VALUES ('1002', 'C002', '88'); INSERT INTO `score` VALUES ('1002', 'C003', '84'); INSERT INTO `score` VALUES ('1002', 'C004', '89'); INSERT INTO `score` VALUES ('1002', 'C005', '78'); INSERT INTO `score` VALUES ('1003', 'C001', '69'); INSERT INTO `score` VALUES ('1003', 'C002', '89'); INSERT INTO `score` VALUES ('1003', 'C003', '85'); INSERT INTO `score` VALUES ('1003', 'C004', '90'); INSERT INTO `score` VALUES ('1003', 'C005', '79'); INSERT INTO `score` VALUES ('1004', 'C001', '70'); INSERT INTO `score` VALUES ('1004', 'C002', '90'); INSERT INTO `score` VALUES ('1004', 'C003', '86'); INSERT INTO `score` VALUES ('1004', 'C004', '91'); INSERT INTO `score` VALUES ('1005', 'C001', '71'); INSERT INTO `score` VALUES ('1005', 'C002', '91'); INSERT INTO `score` VALUES ('1005', 'C003', '87'); INSERT INTO `score` VALUES ('1005', 'C004', '92'); INSERT INTO `score` VALUES ('1006', 'C001', '72'); INSERT INTO `score` VALUES ('1006', 'C002', '92'); INSERT INTO `score` VALUES ('1006', 'C003', '88'); INSERT INTO `score` VALUES ('1006', 'C004', '93'); -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stuid` varchar(16) NOT NULL COMMENT '學號', `stunm` varchar(20) NOT NULL COMMENT '學生姓名', PRIMARY KEY (`stuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1001', '張三'); INSERT INTO `student` VALUES ('1002', '李四'); INSERT INTO `student` VALUES ('1003', '趙二'); INSERT INTO `student` VALUES ('1004', '王五'); INSERT INTO `student` VALUES ('1005', '劉青'); INSERT INTO `student` VALUES ('1006', '周明');
不進行行轉列的查詢
SELECT
st.stuid ID,
st.stunm 姓名,
cs.coursenm 課程名,
sc.scores 成績
FROM
student st,
score sc,
courses cs
WHERE
st.stuid = sc.stuid
AND sc.courseno = cs.courseno
對以上資料進行行轉列
SELECT st.stuid 編號, st.stunm 姓名, Max( CASE c.coursenm WHEN '大學語文' THEN s.scores ELSE 0 END ) '大學語文', max( CASE c.coursenm WHEN '新視野英語' THEN IFNULL(s.scores, 0) ELSE 0 END ) '新視野英語', Max( CASE c.coursenm WHEN '離散數學' THEN IFNULL(s.scores, 0) ELSE 0 END ) '離散數學', MAX( CASE c.coursenm WHEN '概率論與數理統計' THEN IFNULL(s.scores, 0) ELSE 0 END ) '概率論與數理統計', MAX( CASE c.coursenm WHEN '線性代數' THEN IFNULL(s.scores, 0) ELSE 0 END ) '線性代數', MAX( CASE c.coursenm WHEN '高等數學(一)' THEN IFNULL(s.scores, 0) ELSE 0 END ) '高等數學(一)', MAX( CASE c.coursenm WHEN '高等數學(二)' THEN IFNULL(s.scores, 0) ELSE 0 END ) '高等數學(二)' FROM student st LEFT JOIN score s ON st.stuid = s.stuid LEFT JOIN courses c ON c.courseno = s.courseno GROUP BY st.stuid