1. 程式人生 > >MySQL行轉列經典案例

MySQL行轉列經典案例

 

準備資料表

/*
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
查詢結果