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聚合分组
小结论:
- 先进行case进行查询结果 在进行分组 聚合查询
- 查询结果如上图 未分组之前数据
- 进行分组 分组后课节为1,2
- 进行课节1 的聚合max查询
这里使用max查询 注意看
不进行分组时的图
因为是max取最大值空字符
比数学英语
这类要小所以结果会这样
采用min 聚合函数:
看周一的默认最小值为
111111
因为字符串111111
比数学语文这一类要小
周二周三 因为数据没分组之前有空串
所以空串
是最小的
count聚合函数
求记录个数 跟内容无关了
所以转化为三维表 用不到这个
avg聚合
周一结果:1111112
还是参考未分组之前的图111111
2
/3
=74074平均值 :2
是有2个值为111111的3
课节为1个记录数有3个
周二周三结果:字符串无法求出数字值
这个条件需要根据业务需求来确定是否使用
sum聚合
参考未分组之前的图
周一结果:111111*2
周二周三结果:字符串无法求出数字值