You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL分组统计问题:按CASE组合统计账号数量

Oracle SQL实现指定CASE组合的acc统计

要实现你需要的分组统计,核心思路是先给每个acc聚合出它对应的所有CASE集合,再将这些集合映射到你指定的分类,最后统计每个分类的acc数量。下面是具体的实现步骤和代码:

步骤拆解

  1. 聚合每个acc的CASE集合:用LISTAGG函数将每个acc对应的所有CASE按顺序拼接成唯一的字符串(注意去重,避免同一个acc重复出现相同CASE)。
  2. 映射到目标分类:根据拼接后的CASE集合,匹配到你需要的7种分类(单独a、单独b、单独c、a+b、b+c、a+b+c、其他组合)。
  3. 统计分类数量:对映射后的分类分组,统计每个分类下的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:58:10