Oracle SQL计算两数相对百分比并按百分比区间分组统计方法
偏差区间分组统计实现方案
原SQL的问题
你之前写的筛选SQL存在两处错误,无法得到正确结果:
- 偏差计算公式错误:目标是统计Number A相对Number B的偏差率,正确公式为
ABS((NumberA - NumberB)/NumberB * 100),你写的NumberA/NumberB * 100计算的是A占B的百分比,不是两者的偏差值。以第一行示例数据为例,A=105、B=100,正确偏差是5%,你的公式计算结果为105,完全不符合筛选逻辑。 - 字段名笔误:后半段筛选条件中写的
Number为不存在的字段,会直接报SQL执行错误,应改为NumberB。
基于CASE WHEN的分组统计SQL
直接通过CASE WHEN匹配每行数据对应的偏差区间,再分组计数即可得到你需要的结果,代码如下:
SELECT COUNT(*), deviation_segment AS Segment FROM ( SELECT CASE WHEN ABS((NumberA - NumberB)/NumberB * 100) BETWEEN 0 AND 6 THEN '0-6%' WHEN ABS((NumberA - NumberB)/NumberB * 100) BETWEEN 7 AND 15 THEN '7-15%' WHEN ABS((NumberA - NumberB)/NumberB * 100) BETWEEN 16 AND 20 THEN '16-20%' -- 可根据业务需要追加更多区间,例如下方20%以上区间的配置 -- WHEN ABS((NumberA - NumberB)/NumberB * 100) > 20 THEN '20%以上' ELSE '未匹配区间' END AS deviation_segment FROM 你的实际表名 -- 过滤NumberB为0的记录,避免除零报错 WHERE NumberB <> 0 ) t GROUP BY deviation_segment;
用你提供的5条示例数据运行上述SQL,得到的统计结果为:
- 0-6%区间:1行
- 7-15%区间:2行
- 16-20%区间:1行
- 剩余1行偏差约26.3%,如果配置了20%以上区间则归入该档,否则归入未匹配区间
边界提示:如果业务要求区间无重叠无间隙,可将
BETWEEN写法改为明确的大小判断,例如将7-15%区间的判断条件写为ABS(...) > 6 AND ABS(...) <=15,避免临界值(如偏差恰好为6%)的归属争议。
内容的提问来源于stack exchange,提问作者FrocketGaming
相关产品推荐
相关产品推荐

