翼度科技»论坛 编程开发 mysql 查看内容

MySQL行列互换的实现示例

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
场景1 行转换列

1、表结构和数据
  1. /*
  2. Navicat Premium Data Transfer

  3. Source Server         : 本地
  4. Source Server Type    : MySQL
  5. Source Server Version : 80027
  6. Source Host           : localhost:3306
  7. Source Schema         : school

  8. Target Server Type    : MySQL
  9. Target Server Version : 80027
  10. File Encoding         : 65001

  11. Date: 13/06/2024 14:50:51
  12. */

  13. SET NAMES utf8mb4;
  14. SET FOREIGN_KEY_CHECKS = 0;

  15. -- ----------------------------
  16. -- Table structure for score
  17. -- ----------------------------
  18. DROP TABLE IF EXISTS `score`;
  19. CREATE TABLE `score`  (
  20.   `stu_no` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学号',
  21.   `course_no` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '课程号',
  22.   `score_prize` decimal(4, 1) NULL DEFAULT NULL COMMENT '成绩',
  23.   PRIMARY KEY (`stu_no`, `course_no`) USING BTREE
  24. ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

  25. -- ----------------------------
  26. -- Records of score
  27. -- ----------------------------
  28. INSERT INTO `score` VALUES ('0001', '0001', 40.0);
  29. INSERT INTO `score` VALUES ('0001', '0002', 50.0);
  30. INSERT INTO `score` VALUES ('0001', '0003', 48.0);
  31. INSERT INTO `score` VALUES ('0002', '0001', 40.0);
  32. INSERT INTO `score` VALUES ('0002', '0002', 30.0);
  33. INSERT INTO `score` VALUES ('0002', '0003', 99.0);
  34. INSERT INTO `score` VALUES ('0003', '0001', 70.0);
  35. INSERT INTO `score` VALUES ('0003', '0002', 77.0);
  36. INSERT INTO `score` VALUES ('0003', '0003', 60.0);

  37. SET FOREIGN_KEY_CHECKS = 1;
复制代码
2、效果图说明,第一列用户信息stu_no,第二列课程号course_no,第三列课程成绩

stu_no语文数学英语000140.050.048.0000240.030.099.0000370.077.060.03、实现SQL
  1. select stu_no,
  2.        sum(IF(course_no = '0001', score_prize, 0)) as '语文',
  3.        sum(IF(course_no = '0002', score_prize, 0)) as '数学',
  4.        sum(IF(course_no = '0003', score_prize, 0)) as '英语'
  5. from score
  6. group by stu_no;
复制代码
场景2:列转换行

1、准备数据表结构和数据
  1. /*
  2. Navicat Premium Data Transfer

  3. Source Server         : 本地
  4. Source Server Type    : MySQL
  5. Source Server Version : 80027
  6. Source Host           : localhost:3306
  7. Source Schema         : school

  8. Target Server Type    : MySQL
  9. Target Server Version : 80027
  10. File Encoding         : 65001

  11. Date: 13/06/2024 14:54:37
  12. */

  13. SET NAMES utf8mb4;
  14. SET FOREIGN_KEY_CHECKS = 0;

  15. -- ----------------------------
  16. -- Table structure for cjs
  17. -- ----------------------------
  18. DROP TABLE IF EXISTS `cjs`;
  19. CREATE TABLE `cjs`  (
  20.   `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  21.   `chinese` int NULL DEFAULT NULL,
  22.   `math` int NULL DEFAULT NULL,
  23.   `phy` int NULL DEFAULT NULL
  24. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

  25. -- ----------------------------
  26. -- Records of cjs
  27. -- ----------------------------
  28. INSERT INTO `cjs` VALUES ('张三', 89, 90, 79);
  29. INSERT INTO `cjs` VALUES ('李四', 88, 79, 90);

  30. SET FOREIGN_KEY_CHECKS = 1;
复制代码
2、效果图

namecourse张三90张三89张三79李四79李四88李四903、业务代码
  1. select *
  2. from (
  3.          select name, math as course
  4.          from cjs
  5.          union all
  6.          select name, chinese as course
  7.          from cjs
  8.          union all
  9.          select name, phy as course
  10.          from cjs
  11.      ) t
  12. order by t.name;
复制代码
到此这篇关于MySQL行列互换的实现示例的文章就介绍到这了,更多相关MySQL行列互换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/3230048ux.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具