group by的一点小说明
生活随笔
收集整理的这篇文章主要介绍了
group by的一点小说明
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
工作闲暇之余,看了看oracle的书,看到一个点,觉得很有用,利用这个点,希望大家有收获,同时与希望大家在写SQL的时候,think twic,make choice(三思而后行)
下面看需求:
统计所有领取佣金和不领取佣金的人数、平均工资
这个需求,看上去很简单,第一思维就是使用group by 进行分组,求结果。但是有坑,请看下面代码与结果
select * from emp;------------------------------------ emopno ename job sal hiredate sal comm deptno 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 --统计所有领取佣金和不领取佣金的人数、平均工资 select comm,count(*),avg(sal) from emp e group by e.comm; --结果 comm count(*) avg(sal)10 2342.5 1400.00 1 1250 500.00 1 1250 300.00 1 1600 0.00 1 1500执行完语句,发现结果不对!!
问题:使用group by的时候会把每一个种子值(comm)当做一个分组,所以不可能直接使用group by。
现在把需求拆分:
1、统计所有领取佣金的人数、平均工资
2、统计所有不领取佣金的人数、平均工资
3、把1、2合并,就成了:统计所有领取佣金和不领取佣金的人数、平均工资
正确写法如下:
select '领取佣金' info, count(*), avg(sal)from emp ewhere e.comm is not null union select '不领取佣金' info, count(*), avg(sal)from emp ewhere e.comm is null;--结果: info count(*) avg(sal) 不领取佣金 10 2342.5 领取佣金 4 1400这个例子说明了,要把需求分析清楚,在写语句,同时并不是什么时候都适合用分组,要具体情况具体分析:think twic,make choice(三思而后行)
总结
以上是生活随笔为你收集整理的group by的一点小说明的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Android九宫格界面实现点击每个格点
- 下一篇: 光伏行业十个人的江湖:霸道总裁pk硬汉书