group by的一点小说明
工作閑暇之余,看了看oracle的書,看到一個(gè)點(diǎn),覺得很有用,利用這個(gè)點(diǎn),希望大家有收獲,同時(shí)與希望大家在寫SQL的時(shí)候,think?twic,make?choice(三思而后行)
下面看需求:
統(tǒng)計(jì)所有領(lǐng)取傭金和不領(lǐng)取傭金的人數(shù)、平均工資
這個(gè)需求,看上去很簡單,第一思維就是使用group?by? 進(jìn)行分組,求結(jié)果。但是有坑,請看下面代碼與結(jié)果
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 --統(tǒng)計(jì)所有領(lǐng)取傭金和不領(lǐng)取傭金的人數(shù)、平均工資 select comm,count(*),avg(sal) from emp e group by e.comm; --結(jié)果 comm count(*) avg(sal)10 2342.5 1400.00 1 1250 500.00 1 1250 300.00 1 1600 0.00 1 1500執(zhí)行完語句,發(fā)現(xiàn)結(jié)果不對!!
問題:使用group by的時(shí)候會(huì)把每一個(gè)種子值(comm)當(dāng)做一個(gè)分組,所以不可能直接使用group by。
現(xiàn)在把需求拆分:
1、統(tǒng)計(jì)所有領(lǐng)取傭金的人數(shù)、平均工資
2、統(tǒng)計(jì)所有不領(lǐng)取傭金的人數(shù)、平均工資
3、把1、2合并,就成了:統(tǒng)計(jì)所有領(lǐng)取傭金和不領(lǐng)取傭金的人數(shù)、平均工資
正確寫法如下:
select '領(lǐng)取傭金' info, count(*), avg(sal)from emp ewhere e.comm is not null union select '不領(lǐng)取傭金' info, count(*), avg(sal)from emp ewhere e.comm is null;--結(jié)果: info count(*) avg(sal) 不領(lǐng)取傭金 10 2342.5 領(lǐng)取傭金 4 1400這個(gè)例子說明了,要把需求分析清楚,在寫語句,同時(shí)并不是什么時(shí)候都適合用分組,要具體情況具體分析:think?twic,make?choice(三思而后行)
總結(jié)
以上是生活随笔為你收集整理的group by的一点小说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android九宫格界面实现点击每个格点
- 下一篇: 光伏行业十个人的江湖:霸道总裁pk硬汉书