• mysql查询:行转列与列转行


    1. 行转列

    1.1 什么是行转列

            从表面理解,就是表里存储在行上的数据,在查询结果里展示在列上面。举例说明一下,如果在数据库学生的科目分数是以下面的结构存储:

            然后在输出查询结果的时候,却希望是这样的:

            这就是行转列,把原本以行的结构存储的科目,在输出查询结果的时候在列上展示。

    1.2 准备工作

    1. #创建学生科目分数表
    2. CREATE TABLE `subject_score` (
    3. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    4. `name` varchar(100) DEFAULT NULL,
    5. `subject` varchar(100) DEFAULT NULL,
    6. `score` int(11) DEFAULT NULL,
    7. PRIMARY KEY (`id`)
    8. ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    9. #插入数据
    10. INSERT INTO subject_score (id, name, subject, score) VALUES(1, '张三', '语文', 96);
    11. INSERT INTO subject_score (id, name, subject, score) VALUES(2, '张三', '数学', 89);
    12. INSERT INTO subject_score (id, name, subject, score) VALUES(3, '张三', '英语', 72);
    13. INSERT INTO subject_score (id, name, subject, score) VALUES(4, '李四', '语文', 76);
    14. INSERT INTO subject_score (id, name, subject, score) VALUES(5, '李四', '数学', 84);
    15. INSERT INTO subject_score (id, name, subject, score) VALUES(6, '李四', '英语', 98);
    16. INSERT INTO subject_score (id, name, subject, score) VALUES(7, '王麻子', '语文', 19);
    17. INSERT INTO subject_score (id, name, subject, score) VALUES(8, '王麻子', '数学', 96);
    18. INSERT INTO subject_score (id, name, subject, score) VALUES(9, '王麻子', '英语', 86);

    1.3 行转列的实现原理

            1.使用case when,先把行上数据转化到列上

    1. select
    2. name,
    3. case when subject = '语文' then score else 0 end 'chinese',
    4. case when subject = '数学' then score else 0 end 'match',
    5. case when subject = '英语' then score else 0 end 'english'
    6. from
    7. subject_score ss;

            2.从执行结果看,每一行数据,有两列都是0,再使用max()函数取最大值,应该就能得到行转列后的效果了。

    1. select
    2. name,
    3. max(case when subject = '语文' then score else 0 end ) 'chinese',
    4. max(case when subject = '数学' then score else 0 end ) 'match',
    5. max(case when subject = '英语' then score else 0 end ) 'english'
    6. from
    7. subject_score ss
    8. group by
    9. name ;

    2. 列转行

    2.1 什么是列转行

            和行转列刚好相反,从表面理解,就是表里存储在列上的数据,在查询结果里展示在行上面。

            实际存储结构:

            输出效果:

    2.2 准备工作

    1. #创建学生科目分数表
    2. CREATE TABLE `subject_score2` (
    3. `id` int(11) NOT NULL AUTO_INCREMENT,
    4. `name` varchar(100) DEFAULT NULL,
    5. `chinese` varchar(100) DEFAULT NULL,
    6. `english` varchar(100) DEFAULT NULL,
    7. `math` varchar(100) DEFAULT NULL,
    8. PRIMARY KEY (`id`)
    9. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    10. #插入数据
    11. INSERT INTO subject_score2 (id, name, chinese, english, math) VALUES(1, '张三', '86', '99', '65');
    12. INSERT INTO subject_score2 (id, name, chinese, english, math) VALUES(2, '李四', '98', '36', '75');
    13. INSERT INTO subject_score2 (id, name, chinese, english, math) VALUES(3, '王麻子', '72', '85', '89');

    2.3 列转行的实现原理

            列转行的实现原理比较简单,就是把各列拆分成行,最后再各行使用union进行联合查询,就得到了最终想要的结果。

    1. select
    2. name,subject,score
    3. from
    4. (select name,'语文' as subject,chinese as score from subject_score2 s1
    5. union
    6. select name,'英语' as subject ,english as score from subject_score2 s2
    7. union
    8. select name,'数学' as subject ,math as score from subject_score2 s3 ) s
    9. order by name asc ;

    3. 总结

            行转列、列转行,其实并不是很复杂,实际是运用了一些技巧灵活使用了mysql提供函数、语法。

  • 相关阅读:
    1688阿里巴巴官方开放平台API接口获取商品详情、商品规格信息列表、价格、宝贝详情数据调用示例说明
    Kubernetes(k8s)— Concepts — Containers
    spring5.3 十一:spring启动过程源码分析
    LeetCode-剑指22-链表中倒数第k个节点
    基于Python的QQ音乐音频图片搜索系统
    Docker的数据管理和端口映射实现容器访问
    C++基础——对于C语言缺点的补充(2)
    FastDFS基础学习(二)之安装FastDFS
    【云原生&微服务>SCG网关篇十一】Spring Cloud Gateway解决跨域问题
    交换机与路由技术-16-生成树协议STP
  • 原文地址:https://blog.csdn.net/fox9916/article/details/127943509