mySql 行转列 列转行 case when

from https://www.jianshu.com/p/5a2dae144238

mark:

-- 建表
CREATE TABLE `student` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(20) DEFAULT NULL,
  `COURSE` varchar(20) DEFAULT NULL,
  `SCORE` float DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

-- 测试数据
insert into student(USER_NAME, COURSE, SCORE)  values
("张三", "数学", 34),
("张三", "语文", 58),
("张三", "英语", 58),
("李四", "数学", 45),
("李四", "语文", 87),
("李四", "英语", 45),
("王五", "数学", 76),
("王五", "语文", 34),
("王五", "英语", 89);

-- 行转列
SELECT user_name ,
    MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
    MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM student
GROUP BY USER_NAME;
*****************************************************************************
-- 建表
CREATE TABLE `grade` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(20) DEFAULT NULL,
  `CN_SCORE` float DEFAULT NULL,
  `MATH_SCORE` float DEFAULT NULL,
  `EN_SCORE` float DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-- 测试数据
insert into grade(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values
("张三", 34, 58, 58),
("李四", 45, 87, 45),
("王五", 76, 34, 89);

-- 列转行 测试
select user_name, '语文' COURSE , CN_SCORE as SCORE from grade
union select user_name, '数学' COURSE, MATH_SCORE as SCORE from grade
union select user_name, '英语' COURSE, EN_SCORE as SCORE from grade
order by user_name,COURSE;

SELECT * FROM student;

mySql 行转列 列转行 case when_第1张图片
SELECT user_name ,
    MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
    MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM student GROUP BY USER_NAME;

SELECT * FROM  grade;

SELECT user_name, '语文' COURSE , CN_SCORE AS  SCORE FROM grade
union SELECT user_name, '数学' COURSE, MATH_SCORE AS  SCORE FROM grade
union SELECT user_name, '英语' COURSE, EN_SCORE AS  SCORE FROM grade
ORDER BY  user_name,COURSE;

 

你可能感兴趣的:(mysql)