mysql行转列,列转行,以及为什么行转列的时候用max函数

行转列首先我们先创建一个表

表如下
在这里插入图片描述

CREATE TABLE test_hjsjy_1(
	`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 auto_increment=1 DEFAULT CHARSET=utf8;
给表赋值
INSERT INTO test_hjsjy_1(user_name,COURSE,score) VALUES
("老大","数学",56),
("老大","语文",35),
("老大","英语",87),
("老二","数学",36),
("老二","语文",78),
("老二","英语",52),
("老三","数学",72),
("老三","语文",91),
("老三","英语",59);
行转列mysql语句
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 test_hjsjy_1 
GROUP BY user_name;

效果如下
在这里插入图片描述

这里大部分第一次学mysql 行转列地时候看到这个语句会很奇怪为啥要用MAX函数呢? 这个不是多余地吗?

解答: 这并不是多余地,其实我们来测试一下我不加max看是什么效果

SELECT user_name ,
    (CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    (CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
   (CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM test_hjsjy_1
GROUP BY user_name;

看一下我们查询的效果
在这里插入图片描述
这里我们会发现我们老大老二老三的语文和英语成绩怎么没了都是0?
我们再尝试看看把上面的查询语句中group by user_name 试着去掉

SELECT user_name ,
    (CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
    (CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
   (CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM test_hjsjy_1

再看看查询结果
在这里插入图片描述
聪明的人的现在知道为啥需要用max函数了,其实是因为group by分组,你没有max函数 他就会查询每个分组的第一个元组,所以max函数是不能少的,这个问题也启发我们,遇到这种问题我们可以通过调试sql,来解决我们遇到的疑惑。

列转行举例首先我们需要创建一个表

表如下
在这里插入图片描述

CREATE TABLE `test_hjsjy_2` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `user_name` varchar(20) DEFAULT NULL,
 `chinese_score` float DEFAULT NULL,
 `math_score` float DEFAULT NULL,
 `english_score` float DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
列转行表赋值
insert into test_hjsjy_2(user_name, chinese_score, math_score, english_score) values
("老大", 34, 58, 58),
("老二", 45, 87, 45),
("老三", 76, 34, 89);
列转行mysql语句
select user_name, '语文' COURSE , chinese_score as SCORE from test_hjsjy_2
union select user_name, '数学' COURSE, math_score as SCORE from test_hjsjy_2
union select user_name, '英语' COURSE, english_score as SCORE from test_hjsjy_2
order by user_name,course;

表结果如下
在这里插入图片描述
这样我们也就实现了列转行。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值