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硬汉书