SQL对取值范围进行分组汇总的几种办法
展开全部
在统计工作中,我们经常遇到对一个数量的取值范围进行分组汇总的情况,比如假定id取值为1~20000,按照组距5000进行分组,我们要分别求出5000以下包括5000,5000以上10000以下包括10000,10000以上15000以下包括15000,15000以上20000以下包括20000。的计数,可以用内置取整函数ceil和除法运算得到。select ceil(id/5000) f, count(1) cnt from t1 group by ceil(id/5000) order by 1;
F CNT---------- ---------- 1 5000 2 5000 3 5000 4 5000
但是这种方法我们无法对不等距分组的情况进行处理,假定我们要分别求出500以下包括500,500以上1000以下包括1000,1000以上5000以下包括5000,5000以上20000以下包括20000的计数,ceil函数就无能为力了。这时我们可以用到自定义函数,
create or replace FUNCTION g2(v NUMBER) RETURN INT IS TYPE it IS TABLE OF INT;BEGIN IF v>0 AND v<= 500 THEN RETURN 1; ELSIF v>500 AND v<= 1000 THEN RETURN 2; ELSIF v>1000 AND v<= 5000 THEN RETURN 3; ELSIF v>5000 AND v<= 20000 THEN RETURN 4; ELSE RETURN 0; END IF;END g2;/
select g2(id) f, count(1) cnt from t1 group by g2(id) order by 1;
F CNT---------- ---------- 1 500 2 500 3 4000 4 15000当然,我们也可以不借助函数,而用case when语句实现同样的条件分组,但是语句比较冗长,列名是固定的。不利于阅读与修改,也不利于代码重用。select (casewhen id >0 AND id<= 500 THEN 1when id >500 AND id<= 1000 THEN 2when id >1000 AND id<= 5000 THEN 3when id >5000 AND id<= 20000 THEN 4else 0end) f,count(1) cnt from t1 group by(casewhen id >0 AND id<= 500 THEN 1when id >500 AND id<= 1000 THEN 2when id >1000 AND id<= 5000 THEN 3when id >5000 AND id<= 20000 THEN 4else 0end)order by 1;
F CNT---------- ---------- 1 500 2 500 3 4000 4 15000
本文出自 “Java大白的战地” 博客,请务必保留此出处http://8023java.blog.51cto.com/10117207/1766721
SQL对取值范围进行分组汇总的几种办法
标签:sql 优化
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询