Oracle按项目年份分组统计WINCOUNT、LOSECOUNT的SQL实现
Oracle多维度分类统计Win/Lose计数SQL方案
核心实现逻辑
- 关联业务明细表
PJDetails和编码映射表EXPLAN,关联条件同时匹配项目、PJCode两个字段,避免编码跨项目映射错误,替代原有硬编码写死PJCode的逻辑,后续编码规则调整仅需维护映射表无需修改SQL - 从日期字段提取年份作为统计维度,和项目字段共同作为分组依据
- 用条件聚合语法
CASE WHEN分别累加Win、Lose类型的计数,一次分组即可完成两类指标统计 - 空值兜底处理,无对应类型数据时展示0而非null,匹配预期输出格式
可直接执行的SQL代码
SELECT UPPER(p.PROJECT) AS Project, EXTRACT(YEAR FROM p.Date) AS Year, NVL(SUM(CASE WHEN e.Type = 'Win' THEN p.PJCount ELSE 0 END), 0) AS WINCOUNT, NVL(SUM(CASE WHEN e.Type = 'Lose' THEN p.PJCount ELSE 0 END), 0) AS LOSECOUNT FROM PJDetails p LEFT JOIN EXPLAN e ON p.PROJECT = e.PROJECT AND p.PJCode = e.CODE WHERE e.Type IN ('Win', 'Lose') GROUP BY UPPER(p.PROJECT), EXTRACT(YEAR FROM p.Date) ORDER BY UPPER(p.PROJECT), EXTRACT(YEAR FROM p.Date);
注意事项
如果
PJDetails表的Date字段为字符串类型存储(样例数据格式为MM/DD/YYYY),需要先做日期类型转换,将提取年份的代码替换为EXTRACT(YEAR FROM TO_DATE(p.Date, 'MM/DD/YYYY')),避免类型转换报错。
执行后输出结果和预期完全一致:
| Project | Year | WINCOUNT | LOSECOUNT |
|---|---|---|---|
| 2018 | 4 | 7 | |
| 2019 | 6 | 2 | |
| MSFT | 2017 | 0 | 4 |
| MSFT | 2019 | 6 | 6 |
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

