case when 和聚合函数使用


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `课节` int(255) NULL DEFAULT NULL,
  `星期` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `课程名` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, '1', '数学');
INSERT INTO `test` VALUES (2, '1', '英语');
INSERT INTO `test` VALUES (1, '2', '计算机');
INSERT INTO `test` VALUES (2, '2', '数学');
INSERT INTO `test` VALUES (1, '3', '计算机');
INSERT INTO `test` VALUES (2, '3', '语文');

SET FOREIGN_KEY_CHECKS = 1;

select 课节,
max(case 星期 WHEN 1 THEN 课程名 ELSE "" end) as 周一,
max(case 星期 WHEN 2 THEN 课程名 ELSE "" end) as 周二,
max(case 星期 WHEN 3 THEN 课程名 ELSE "" end) as 周三
from test GROUP BY 课节

原表数据:

分析:

不进行分组:

每条记录根据星期来确定 周一 、周二、周三的课程名 如果没有满足when条件的就是else
这里else 可以为 空

采用max聚合分组

小结论:

  1. 先进行case进行查询结果 在进行分组 聚合查询
  2. 查询结果如上图 未分组之前数据
  3. 进行分组 分组后课节为1,2
  4. 进行课节1 的聚合max查询

这里使用max查询 注意看不进行分组时的图 因为是max取最大值 空字符数学英语这类要小所以结果会这样

采用min 聚合函数:

看周一的默认最小值为111111因为字符串111111数学语文这一类要小
周二周三 因为数据没分组之前有空串所以 空串是最小的

count聚合函数

求记录个数 跟内容无关了
所以转化为三维表 用不到这个

avg聚合

周一结果:1111112
还是参考未分组之前的图 111111
2/3=74074平均值 :2是有2个值为111111的3 课节为1个记录数有3个
周二周三结果:字符串无法求出数字值
这个条件需要根据业务需求来确定是否使用

sum聚合

参考未分组之前的图
周一结果:111111*2
周二周三结果:字符串无法求出数字值