sql - case语句和if函数
为什么会有本文?
问题:需要从成绩表里面获取成绩单(排名,单科成绩,总分)
处理:按名称分组,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;