• mysql之行转列与列转行


    mysql之行转列与列转行是数据查询的常见操作,以更好的来展示数据,下面就详细说说怎么实现。

    行转列

    行转列的话,就是将一条一条的行数据记录转换为一条列数据展示,一般来说是根据某一列来做汇总数据的操作,看着更直观,一目了然。

      

    建表语句:

    1 CREATE TABLE `st_grade` (
    2   `id` int(10) NOT NULL AUTO_INCREMENT,
    3   `stu_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
    4   `course` varchar(20) DEFAULT NULL,
    5   `score` float(4,1) DEFAULT NULL,
    6   PRIMARY KEY (`id`)
    7 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

    插入数据:

    1 INSERT INTO `st_grade` VALUES ('1', '张三', '语文', '86.0');
    2 INSERT INTO `st_grade` VALUES ('2', '张三', '数学', '90.0');
    3 INSERT INTO `st_grade` VALUES ('3', '张三', '英语', '75.0');
    4 INSERT INTO `st_grade` VALUES ('4', '李四', '语文', '92.0');
    5 INSERT INTO `st_grade` VALUES ('5', '李四', '数学', '93.0');
    6 INSERT INTO `st_grade` VALUES ('6', '李四', '英语', '96.0');
    7 INSERT INTO `st_grade` VALUES ('7', '王五', '语文', '82.0');
    8 INSERT INTO `st_grade` VALUES ('8', '王五', '数学', '71.0');
    9 INSERT INTO `st_grade` VALUES ('9', '王五', '英语', '74.0');

    查询语句:

    1 select stu_name ,
    2   max(case course when '语文' then score else 0 end ) 语文,
    3   max(case course when '数学' then score else 0 end ) 数学,
    4   max(case course when '英语' then score else 0 end ) 英语
    5 from st_grade
    6 group by stu_name;

    列转行


    列转行的话,就是将一条列数据转换为一条一条的行数据记录展示,将某一行数据根据某些列进行分组操作。

     建表语句:

    1 CREATE TABLE `st_grade` (
    2   `id` int(10) NOT NULL AUTO_INCREMENT,
    3   `stu_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
    4   `course` varchar(20) DEFAULT NULL,
    5   `score` float(4,1) DEFAULT NULL,
    6   PRIMARY KEY (`id`)
    7 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

    插入语句:

    1 INSERT INTO `st_grade` VALUES ('1', '张三', '语文', '86.0');
    2 INSERT INTO `st_grade` VALUES ('2', '张三', '数学', '90.0');
    3 INSERT INTO `st_grade` VALUES ('3', '张三', '英语', '75.0');
    4 INSERT INTO `st_grade` VALUES ('4', '李四', '语文', '92.0');
    5 INSERT INTO `st_grade` VALUES ('5', '李四', '数学', '93.0');
    6 INSERT INTO `st_grade` VALUES ('6', '李四', '英语', '96.0');
    7 INSERT INTO `st_grade` VALUES ('7', '王五', '语文', '82.0');
    8 INSERT INTO `st_grade` VALUES ('8', '王五', '数学', '71.0');
    9 INSERT INTO `st_grade` VALUES ('9', '王五', '英语', '74.0');

    查询语句:

    1 select stu_name, '语文' course , cn_score as score 
    2     from st_grade2
    3     union select stu_name, '数学' course, math_score as score from st_grade2
    4     union select stu_name, '英语' course, en_score as score from st_grade2
    5 order by stu_name,course;

    以上代码可以直接复制来验证,没有错误。

  • 相关阅读:
    跳跃表原理
    查看Oracle操作历史的试图
    【概念】为什么有时全表扫描比通过索引扫描效率更高
    oracle驱动表以及如何确定驱动表
    SpringBoot学习(三)-----配置Bean
    leetcode 面试题58
    leetcode 1365 有多少小于当前数字的数字
    leetcode 1342 将数字变成 0 的操作次数
    leetcode1313 解压缩编码列表
    leetcode 1071 字符串的最大公因子
  • 原文地址:https://www.cnblogs.com/ailanlan/p/11692999.html
Copyright © 2020-2023  润新知