sql - case语句和if函数

为什么会有本文?
问题:需要从成绩表里面获取成绩单(排名,单科成绩,总分)
处理:按名称分组,SUM聚合运算获取总分,单科成绩需要给定条件来筛选,包含分组语句筛选(case语句或if函数)的字段必须为分组字段或聚合字段,所以单科成绩还需要使用聚合函数(如SUM)包裹一层;
优点:通过,分组+聚合+筛选,实现,列形式的数据转化为行形式的数据;方便将源数据结构转化为自己需要的数据结构,从而进行其它操作;
步骤:

  1. 执行建表语句
  2. 执行插入语句
  3. 执行查询语句
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;
posted @ 2022-06-11 19:54  花兒向陽開  阅读(105)  评论(0编辑  收藏  举报