Oracle SQL分组统计问题:按CASE组合统计账号数量
Oracle SQL实现指定CASE组合的acc统计
要实现你需要的分组统计,核心思路是先给每个acc聚合出它对应的所有CASE集合,再将这些集合映射到你指定的分类,最后统计每个分类的acc数量。下面是具体的实现步骤和代码:
步骤拆解
- 聚合每个acc的CASE集合:用
LISTAGG函数将每个acc对应的所有CASE按顺序拼接成唯一的字符串(注意去重,避免同一个acc重复出现相同CASE)。 - 映射到目标分类:根据拼接后的CASE集合,匹配到你需要的7种分类(单独a、单独b、单独c、a+b、b+c、a+b+c、其他组合)。
- 统计分类数量:对映射后的分类分组,统计每个分类下的acc数量,并按目标结果的顺序排序。
完整SQL代码
WITH acc_case_groups AS ( -- 第一步:聚合每个acc的唯一CASE集合,按字母排序保证一致性 SELECT acc, LISTAGG(DISTINCT CASE, ',') WITHIN GROUP (ORDER BY CASE) AS case_set FROM your_table_name -- 替换成你的实际表名 GROUP BY acc ), category_mapping AS ( -- 第二步:将CASE集合映射到目标分类 SELECT case_set, CASE WHEN case_set = 'a' THEN 'a' WHEN case_set = 'b' THEN 'b' WHEN case_set = 'c' THEN 'c' WHEN case_set = 'a,b' THEN 'a+b' WHEN case_set = 'b,c' THEN 'b+c' WHEN case_set = 'a,b,c' THEN 'a+b+c' ELSE 'a+b+c+…+x' -- 所有未匹配的情况归到这一类(比如包含x或其他CASE) END AS case_category FROM acc_case_groups ) -- 第三步:统计每个分类的acc数量,并按目标顺序排序 SELECT case_category AS case, COUNT(*) AS count_acc FROM category_mapping GROUP BY case_category ORDER BY CASE case_category WHEN 'a' THEN 1 WHEN 'b' THEN 2 WHEN 'c' THEN 3 WHEN 'a+b' THEN 4 WHEN 'b+c' THEN 5 WHEN 'a+b+c' THEN 6 WHEN 'a+b+c+…+x' THEN 7 END;
结果验证
根据你提供的样本数据,执行后会得到和目标一致的结果:
a:1个(acc004)b:2个(acc005、acc006)c:0个(没有acc只包含c)a+b:2个(acc002、acc008)b+c:1个(acc003)a+b+c:2个(acc001、acc007)a+b+c+…+x:1个(accn)
注意事项
- 如果你的表中存在同一个
acc重复出现相同CASE的情况,LISTAGG(DISTINCT ...)会自动去重,保证case_set的准确性。 - 若后续需要新增其他CASE组合分类,只需在
category_mapping的CASE语句中添加对应的匹配规则即可。
内容的提问来源于stack exchange,提问作者Watcharin Chimmachuy
相关产品推荐
相关产品推荐

