PostgreSQL 14按多字段分组统计总数及子字段值计数
PostgreSQL 14 实现分组后多字段值的计数统计
直接用条件聚合就能实现需求,基于你已有的分组SQL,添加针对各字段的条件统计即可,两种写法都能达到效果:
写法一(使用COUNT+CASE)
SELECT org, product, release_date, COUNT(1) AS total, -- 统计date_avail为'no'的数量 COUNT(CASE WHEN date_avail = 'no' THEN 1 END) AS number_of_no, -- 统计date_avail为'yes'的数量 COUNT(CASE WHEN date_avail = 'yes' THEN 1 END) AS number_of_yes, -- 统计status为'green'的数量 COUNT(CASE WHEN status = 'green' THEN 1 END) AS number_of_green, -- 统计status为'yellow'的数量 COUNT(CASE WHEN status = 'yellow' THEN 1 END) AS number_of_yellow FROM test GROUP BY org, product, release_date;
写法二(使用SUM+CASE)
SELECT org, product, release_date, COUNT(1) AS total, SUM(CASE WHEN date_avail = 'no' THEN 1 ELSE 0 END) AS number_of_no, SUM(CASE WHEN date_avail = 'yes' THEN 1 ELSE 0 END) AS number_of_yes, SUM(CASE WHEN status = 'green' THEN 1 ELSE 0 END) AS number_of_green, SUM(CASE WHEN status = 'yellow' THEN 1 ELSE 0 END) AS number_of_yellow FROM test GROUP BY org, product, release_date;
原理说明
两种写法核心都是条件聚合:在GROUP BY分组的基础上,对每条记录判断是否符合目标值,符合则计入统计,不符合则忽略(COUNT写法)或记为0(SUM写法),最终得到分组内各字段不同值的数量。
查询结果
| org | product | release_date | total | number_of_no | number_of_yes | number_of_green | number_of_yellow |
|---|---|---|---|---|---|---|---|
| a | bpm | 2022-07 | 4 | 3 | 1 | 2 | 2 |
| b | ppp | 2022-08 | 2 | 2 | 0 | 2 | 0 |
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

