首页/数据/SQL 速查/带 FILTER 的聚合(PostgreSQL)
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

带 FILTER 的聚合(PostgreSQL)

PostgreSQL 支持聚合函数加 FILTER (WHERE …),只对满足条件的输入计算;MySQL 需要用 CASE 表达式达到同样效果。

SQL 速查数据更新于 2026-10-12

PostgreSQL FILTER

PostgreSQL FILTER
SELECT user_id,
       COUNT(*)                                     AS total,
       COUNT(*) FILTER (WHERE status = 'paid')      AS paid_cnt,
       SUM(amount) FILTER (WHERE status = 'paid')   AS paid_amount
FROM orders
GROUP BY user_id;

MySQL 等价写法

MySQL 等价写法
SELECT user_id,
       COUNT(*) AS total,
       SUM(status = 'paid')          AS paid_cnt,
       SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_amount
FROM orders
GROUP BY user_id;
PG聚合 FILTER 子句,语义清晰
MySQL无 FILTER,用 CASE 或布尔求和
用途一份数据多个口径的条件统计

易错点

  • CASE 忘记 ELSE 0 时,未命中行的 SUM 结果还是对的(NULL 被忽略),但 COUNT(CASE…) 会不符合预期,按函数选写法
  • FILTER 子句需要 PostgreSQL,迁移到 MySQL 时逐条改写

数据来源与参考

  • PostgreSQL Documentation · Aggregate Expressions · FILTER
  • MySQL 8.0 Reference Manual · CASE
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌