如何在双重GROUP BY时排除满足多列条件的COUNT统计?
嘿,我懂你要对SAMPLE表按id的两个部分(01和02)做双重分组,还要统计符合特定条件的id数量的需求了!结合你提到的具体场景,我给你整理了一套可行的方案:
双重GROUP BY实现条件统计方案
首先得明确核心逻辑:我们需要先把id拆分成你说的01和02两个子部分,然后按这两个部分做分组,再针对id_laporan和id_laporan_rekomendasi的对应条件做统计。
核心步骤
- 拆分
id为01和02两个子部分(根据实际格式调整拆分方法) - 按01部分(或同时按01+02部分)执行GROUP BY
- 使用条件聚合函数(CASE搭配COUNT/SUM)统计符合要求的记录数或数值总和
示例SQL(适配多数主流数据库)
SELECT -- 提取id的01部分:如果是固定长度前两位用LEFT,有分隔符用对应拆分函数 LEFT(id, 2) AS id_part01, -- 可选:如果需要按02部分再做第二层分组,就加上这行 -- RIGHT(id, 2) AS id_part02, -- 统计满足条件的记录数:对应你提到的id_laporan=3且rekomendasi=2,以及id_laporan=8的情况 COUNT(CASE WHEN (id_laporan = 3 AND id_laporan_rekomendasi = 2) OR id_laporan = 8 THEN 1 END) AS qualified_record_count, -- 如果需要对某数值列求和(比如假设存在score列) SUM(CASE WHEN (id_laporan = 3 AND id_laporan_rekomendasi = 2) OR id_laporan = 8 THEN score ELSE 0 END) AS qualified_total_score, -- 如果要统计**去重的id数量**(而非重复的记录数) COUNT(DISTINCT CASE WHEN (id_laporan = 3 AND id_laporan_rekomendasi = 2) OR id_laporan = 8 THEN id END) AS unique_qualified_id_count FROM SAMPLE -- 可选:如果只需要针对特定id_part01(比如你说的01部分)过滤 -- WHERE LEFT(id, 2) = '01' -- 双重分组:如果要同时按01和02部分分组,就把GROUP BY改成下面这样 GROUP BY id_part01 -- GROUP BY id_part01, id_part02 ORDER BY id_part01;
针对你的场景调整细节
你提到id:01部分的id_laporan包含3和8,其中id_laporan=3对应id_laporan_rekomendasi=2——如果id_laporan=8时你有其他条件(比如对应某个特定的rekomendasi值),直接修改CASE里的判断逻辑就行:
- 比如
id_laporan=8时要求id_laporan_rekomendasi=5:CASE WHEN (id_laporan = 3 AND id_laporan_rekomendasi = 2) OR (id_laporan = 8 AND id_laporan_rekomendasi = 5) THEN 1 END - 如果
id_laporan=8时只要存在就统计,保留原来的OR id_laporan = 8即可。
不同数据库的适配点
- 字符串拆分函数:如果id是带分隔符的格式(比如
01-001),替换成对应数据库的函数:- PostgreSQL:
SPLIT_PART(id, '-', 1)(取分隔符前的第一部分) - MySQL:
SUBSTRING_INDEX(id, '-', 1) - Oracle:
SUBSTR(id, 1, INSTR(id, '-')-1)
- PostgreSQL:
- 聚合函数:COUNT/SUM的逻辑在所有数据库里是通用的,不需要调整。
内容的提问来源于stack exchange,提问作者Gagantous
相关产品推荐
相关产品推荐

