SQL 条件聚合 使用方法总结

SQL 条件聚合 使用方法总结

核心:聚合函数 + 条件判断,分组内按条件统计不同维度数据

一、核心语法

sql 复制代码
-- 基础格式
聚合函数(CASE WHEN 条件 THEN 字段 END) 别名

常用聚合:SUM/COUNT/AVG/MAX/MIN

二、常用场景&示例

1. 条件求和 SUM

按条件累加指定数据

sql 复制代码
-- 统计男、女各自薪资总和
SELECT
  SUM(CASE WHEN gender='男' THEN salary END) AS man_sal,
  SUM(CASE WHEN gender='女' THEN salary END) AS woman_sal
FROM staff;

2. 条件计数 COUNT

统计符合条件的记录数

sql 复制代码
-- 统计及格、不及格人数
SELECT
  COUNT(CASE WHEN score>=60 THEN 1 END) AS pass_num,
  COUNT(CASE WHEN score<60 THEN 1 END) AS fail_num
FROM exam;

3. 条件平均值 AVG

只计算满足条件数据的均值

sql 复制代码
-- 计算正式员工平均工资
SELECT AVG(CASE WHEN status=1 THEN salary END) FROM staff;

4. 搭配 GROUP BY 分组条件聚合

分组后再细分条件统计

sql 复制代码
-- 按部门分组,统计部门男女人数
SELECT
  dept,
  COUNT(CASE WHEN gender='男' THEN 1 END) AS man_cnt,
  COUNT(CASE WHEN gender='女' THEN 1 END) AS woman_cnt
FROM staff
GROUP BY dept;

三、简写兼容写法

  1. MySQL专属 IF 替代CASE,写法更简短
sql 复制代码
SUM(IF(score>=60, score, 0))
COUNT(IF(gender='男',1,NULL))
  1. 空值特性:不满足条件返回NULL,聚合自动忽略

四、关键规则

  1. 满足条件取字段值,不满足默认返回NULL,聚合自动过滤空值
  2. 适合一行多指标统计,替代多次子查询,性能更高
  3. 可多层条件嵌套,实现区间分级统计
  4. 可和GROUP BYHAVING组合使用

五、区间统计实战

sql 复制代码
-- 统计不同分数段人数
SELECT
  COUNT(CASE WHEN score<60 THEN 1 END) AS low,
  COUNT(CASE WHEN score BETWEEN 60 AND 80 THEN 1 END) AS mid,
  COUNT(CASE WHEN score>80 THEN 1 END) AS high
FROM exam;

六、速记口诀

条件套进聚合里,CASE判断分数据

一行算出多维度,分组统计超便捷

Leetcode 经典例题

每月交易

表:Transactions

Column Name Type
id int
country varchar
state enum
amount int
trans_date date

id 是这个表的主键。

该表包含有关传入事务的信息。

state 列类型为 "approved", "declined" 之一。

编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。

以 任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入:

Transactions table:

id country state amount trans_date
121 US approved 1000 2018-12-18
122 US declined 2000 2018-12-19
123 US approved 2000 2019-01-01
124 DE approved 2000 2019-01-07

输出:

month country trans_count approved_count trans_total_amount approved_total_amount
2018-12 US 2 1 3000 1000
2019-01 US 1 1 2000 2000
2019-01 DE 1 1 2000 2000
sql 复制代码
SELECT 
    DATE_FORMAT(trans_date, '%Y-%m') AS month,
    country,
    COUNT(*) AS trans_count,
    SUM(amount) AS trans_total_amount,
    SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) AS approved_count,
    SUM(CASE WHEN state = 'approved' THEN amount ELSE 0 END) AS approved_total_amount
FROM Transactions
GROUP BY 
    DATE_FORMAT(trans_date, '%Y-%m'),
    country;
相关推荐
风123456789~4 小时前
【Oracle专栏】解决clob+dblink 插入报错 ORA-22992
数据库·oracle
后台模板学习4 小时前
学习的心态高频面试题
java·数据库·学习
redreamSo4 小时前
想给产品加一个 AI 搜索,是上向量数据库还是用 MongoDB 就够了?
数据库·人工智能·mongodb
此冬歌咏4 小时前
自动化服务器运维监控系统(python+shell)
linux·运维·服务器·开发语言·python·自动化
风景的人生4 小时前
虚拟机ip连不上(怀疑是最开始虚拟机复制造成的网络冲突)
linux·运维·服务器
SatanII5 小时前
华为云ECS实践:从创建、镜像制作到弹性伸缩完整实操指南
linux·运维·服务器·学习·centos·华为云
Raas1005 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和OpenRouter区别?企业级能力差距一览
java·服务器·网络·人工智能·gateway·ai网关·mai gateway
APItesterCris5 小时前
告别人工盯品!借助 Open‑Claw 快速搭建电商商品全自动监控与数据分析系统(完整实操代码)
java·大数据·前端·数据库
tedcloud1236 小时前
VoiceStudio 怎么搭建?开源本地 AI 语音克隆、配音与语音工作室
服务器·人工智能·开源·ai编程
SKH.6 小时前
网络(5)数据库
jvm·数据库