分組統計查詢(學習筆記)


查詢出公司每個月支出的工資總和

--查詢出公司每個月支出的工資總和
SELECT SUM(sal) FROM emp;

查詢出公司的最高工資,最低工資和平均工資

--查詢出公司的最高工資,最低工資和平均工資
SELECT MAX(sal),MIN(sal),ROUND(AVG(sal),2) FROM emp;

統計出公司最早雇佣和最晚雇佣的雇佣日期

--統計出公司最早雇佣和最晚雇佣的雇佣日期
SELECT MIN(hiredate) 最早雇佣日期 , MAX(hiredate) 最晚雇佣日期 FROM emp ;

統計公司工資之中中間的工資值

--統計公司工資之中中間的工資值
SELECT MEDIAN(sal) FROM emp ;

驗證COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的使用區別

--驗證COUNT(*)、COUNT(字段)、COUNT(DISTINCT 字段)的使用區別
SELECT COUNT(*) , COUNT(ename) , COUNT(comm) , COUNT(DISTINCT job) FROM emp ;

 分組統計語法

SELECT [DISTINCT]  分組字段 [AS] [列別名] ,... | 統計函數 [AS] [別名] , …. FROM 表名稱1 [表別名1] , 表名稱2 [表別名2] …. [WHERE 條件(s)] 
    [GROUP BY 分組字段]
    [ORDER BY 排序字段 ASC|DESC] ;

單字段分組統計

統計出每個部門的人數
--統計出每個部門的人數
SELECT COUNT(empno) FROM emp GROUP BY deptno; 

 統計出每種職位的最低、最高工資

--統計出每種職位的最低、最高工資
SELECT job,MIN(sal) 最低工資,MAX(sal) 最高工資
FROM emp 
GROUP BY job;

查詢出每個部門的名稱,部門人數,部門平均工資,平均服務年限

--查詢出每個部門的名稱,部門人數,部門平均工資,平均服務年限
SELECT d.dname,COUNT(e.empno),ROUND (AVG(e.sal),2),ROUND(AVG (months_between(SYSDATE,e.hiredate)/12),2)
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.dname;

查詢出公司各個工資等級雇員的數量、平均工資。

--查詢出公司各個工資等級雇員的數量、平均工資。
SELECT s.grade,COUNT(e.empno),ROUND (AVG(e.sal),2)
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
GROUP BY s.grade;

統計領取佣金與不領取佣金的員工的平均工資,平均入職年限,員工人數

--統計領取佣金與不領取佣金的員工的平均工資,平均入職年限,員工人數--comm是空內容不能直接分組,用集合來完成
SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)
FROM emp e
WHERE e.comm IS NULL
UNION 
SELECT ROUND(AVG(e.sal),2),ROUND(AVG(months_between(SYSDATE,e.hiredate)/12),2),COUNT(e.empno)
FROM emp e
WHERE e.comm IS NOT NULL;

多字段分組統計

--語法
SELECT [DISTINCT]  分組字段1 [AS] [列別名] , [分組字段2 [AS] [列別名] , …] | 統計函數 [AS] [別名] , ….
    FROM 表名稱1 [表別名1] , 表名稱2 [表別名2] ….
    [WHERE 條件(s)] 
    [GROUP BY 分組字段1 , 分組字段2 , ….]
    [ORDER BY 排序字段 ASC|DESC] ;
現在要求查詢出每個部門的詳細信息
--現在要求查詢出每個部門的詳細信息,部門編號,部門名稱,部門位置,部門人數,平均工資,總工資,最高、最低工資
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal),SUM(sal),MAX(sal),MIN(sal)
FROM dept d,emp e
WHERE d.deptno=e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc;

HAVING子句

      使用GROUP BY子句可以實現數據的分組顯示,但是在很多時候往往需要對分組之后的數據進行再次的過濾,
而后再通過統計結果進行數據的過濾,而要想實現這樣的功能就只能通過HAVING子句完成。
語法:
SELECT [DISTINCT]  分組字段1 [AS] [列別名] , [分組字段2 [AS] [列別名] , …] | 統計函數 [AS] [別名] , ….
    FROM 表名稱1 [表別名1] , 表名稱2 [表別名2] ….
    [WHERE 條件(s)] 
    [GROUP BY 分組字段1 , 分組字段2 , ….]
    [HAVING 過濾條件(s)]
    [ORDER BY 排序字段 ASC|DESC] ;
查詢出所有平均工資大於2000的職位信息、平均工資、雇員人數
--查詢出所有平均工資大於2000的職位信息、平均工資、雇員人數
SELECT e.job,AVG(e.sal),COUNT(e.empno)
FROM emp e
GROUP BY e.job
HAVING AVG(e.sal)>2000;
列出至少有一個員工的所有部門編號、名稱,並統計出這些部門的平均工資、最低工資、最高工資。
--列出至少有一個員工的所有部門編號、名稱,並統計出這些部門的平均工資、最低工資、最高工資。
SELECT d.deptno,d.dname,AVG(e.sal) avgsal,MIN(e.sal),MAX(e.sal),COUNT(e.empno) 人數
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.dname
HAVING COUNT(e.empno)>0;

顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,
並且要滿足從事同一工作的雇員的月工資合計大於$5000,輸出結果按月工資的合計升序排列

 
--顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,
--並且要滿足從事同一工作的雇員的月工資合計大於$5000,輸出結果按月工資的合計升序排列
SELECT e.job,SUM(e.sal) sumsal
FROM emp e
WHERE e.job<>'SALESMAN' 
GROUP BY e.job
HAVING SUM(e.sal)>5000
ORDER BY sumsal ASC;
HAVING子句是在分組之后使用,主要是為了針對分組的結果進行過濾
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM