mysql行转列

首先创建一个学生表student,表结构如下:

CREATE TABLE student  (
  id int NOT NULL,
  name varchar(50) NULL DEFAULT NULL COMMENT '姓名',
  subject varchar(50) NULL COMMENT '学科',
  score int NULL DEFAULT 0 COMMENT '成绩',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB

插入测试数据:


测试数据

如果现在想得到这样的查询结果:

name      语文       数学       英语   
张三       70         91         82
李四       89         86         53
王五       77         65         62
陈六       68         92         70

首先我们想到用case when then这种方式,很容易写出这样的结果:

SELECT name,
    CASE subject WHEN '语文' THEN score ELSE 0 END AS '语文',
    CASE subject WHEN '数学' THEN score ELSE 0 END AS '数学',
    CASE subject WHEN '英语' THEN score ELSE 0 END AS '英语'
FROM student;

看看这样会有什么样的执行效果:


查询结果

接下来可以根据name进行分组再进行sum求和:

SELECT name,
    sum(CASE subject WHEN '语文' THEN score ELSE 0 END) AS '语文',
    sum(CASE subject WHEN '数学' THEN score ELSE 0 END) AS '数学',
    sum(CASE subject WHEN '英语' THEN score ELSE 0 END) AS '英语'
FROM student GROUP BY name;

测试结果如下:


最终测试结果

也可以再加上总分:

SELECT name,
    sum(CASE subject WHEN '语文' THEN score ELSE 0 END) AS '语文',
    sum(CASE subject WHEN '数学' THEN score ELSE 0 END) AS '数学',
    sum(CASE subject WHEN '英语' THEN score ELSE 0 END) AS '英语',
    sum(score) as 总分
FROM student GROUP BY name ORDER BY '总分' DESC;

测试结果却并不如我们预料是排好序的:


总分

把总分写成英文后排序又正常,日常f**k,改成英文后是正常的。


英文降序排序

后面又重复试了自己坑自己,'总分'是用单引号的,应该把引号去掉或者用 `总分`就可以了。

最终测试结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容