为什么会有本文?
问题:需要从成绩表里面获取成绩单(排名,单科成绩,总分)
处理:按名称分组,SUM聚合运算获取总分,单科成绩需要给定条件来筛选,包含分组语句筛选(case语句或if函数)的字段必须为分组字段或聚合字段,所以单科成绩还需要使用聚合函数(如SUM)包裹一层;
优点:通过,分组+聚合+筛选,实现,列形式的数据转化为行形式的数据;方便将源数据结构转化为自己需要的数据结构,从而进行其它操作;
步骤:
CREATE TABLE `grade` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `course` varchar(255) DEFAULT NULL, `score` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO grade VALUES (null, "王五", "语文", 100), (null, "王五", "数学", 90), (null, "王五", "英语", 80), (null, "李四", "语文", 70), (null, "李四", "数学", 60), (null, "李四", "英语", 50);
-- 方式1:使用case语句 SELECT name, SUM(CASE WHEN course='语文' THEN score ELSE 0 END) AS 语文, SUM(CASE WHEN course='数学' THEN score ELSE 0 END) AS 数学, SUM(CASE WHEN course='英语' THEN score ELSE 0 END) AS 英语, SUM(score) AS 总分 FROM grade GROUP BY name ORDER BY SUM(score) DESC; -- 方式2:使用if函数实现 SELECT name, SUM(IF(course='语文', score, 0)) 语文, SUM(IF(course='数学', score, 0)) 数学, SUM(IF(course='英语', score, 0)) 英语, SUM(score) 总分 FROM grade GROUP BY name ORDER BY SUM(score) DESC;