mysql行列转换

378 阅读1分钟

行转列

创建表

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `name` varchar(32) DEFAULT NULL,
  `subject` varchar(32) DEFAULT NULL,
  `score` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO `test` VALUES (1, '张三', '数学', '95');
INSERT INTO `test` VALUES (2, '张三', '语文', '80');
INSERT INTO `test` VALUES (3, '张三', '英语', '75');
INSERT INTO `test` VALUES (4, '李四', '数学', '45');
INSERT INTO `test` VALUES (5, '李四', '语文', '90');
INSERT INTO `test` VALUES (6, '李四', '英语', '66');

1.join方式

SELECT
	b.NAME,
	b.score AS '数学',
	c.score AS '语文',
	d.score AS '英语' 
FROM
	(SELECT score, NAME FROM test WHERE SUBJECT = '数学' ) b 
	INNER JOIN ( SELECT score, NAME FROM test WHERE SUBJECT = '语文' ) c USING ( NAME )
	INNER JOIN ( SELECT score, NAME FROM test WHERE SUBJECT = '英语' ) d USING ( NAME )

2.case...when

SELECT
	NAME,
	max(case subject when '数学' then score end) as '数学',
	max(case subject when '语文' then score end) as '语文',
	max(case subject when '英语' then score end) as '英语'
 from test	
 GROUP BY name 

3.if

SELECT
	NAME,
	sum(IF(subject='数学',score,0)) as '数学',
	sum(IF(subject='语文',score,0)) as '语文',
	sum(IF(subject='英语',score,0)) as '英语'
 from test	
 GROUP BY name 

列转行

创建表

CREATE TABLE `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `math` varchar(32) DEFAULT NULL,
  `chinese` varchar(32) DEFAULT NULL,
  `english` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

插入数据

INSERT INTO `test2` VALUES (1, '张三', '21', '26', '34');
INSERT INTO `test2` VALUES (2, '李四', '23', '56', '18');

1.union all

SELECT name,'数学' as subject , math as 'score' from test2
union all
SELECT name,'语文' as subject , chinese as 'score' from test2
union all
SELECT name,'英语' as subject , english as 'score' from test2