欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

group by的一点小说明

发布时间:2023/12/14 编程问答 39 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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的一点小说明的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。