1. 程式人生 > >組函式及分組統計

組函式及分組統計

分組函式

SQL中常用的分組函式

    Count(): 計數

    Max():求最大值

    Min():求最小值

    Avg():求平均值

    Sum():求和


-- 統計emp表中的人數
select count(*) from emp; 

-- 統計獲得獎金的人數
select count(comm) from emp;

-- 求所有僱員的最低工資
select min(sal) from emp;

-- 求所有僱員的最高工資
select max(sal) from emp;

-- 求部門編號為20的僱員的平均工資和總工資
select avg(sal),sum(sal) from emp where deptno = 20;

分組統計查詢

語法格式

SELECT {DISTINCT}*|查詢列1 別名1,查詢列2 別名2……

FORM 表名稱1 別名1,表名稱2 別名2,……

{WHERE 條件表示式}

{GROUP BY 分組條件}

{ORDERBY  排序欄位 ASC|DESC,排序欄位 ASC|DESC,……}
-- 統計出每個部門的人數
select deptno,count(empno) from emp group by deptno;

-- 求出每個部門的平均工資
select deptno, avg(sal) from emp group by deptno;

統計每個部門的最高工資,以及獲得最高工資的僱員姓名

如果寫成

SELECT ename,max(sal)
 FROM emp
 GROUP BY deptno

Oracle會提示第 1 行出現錯誤:

ORA-00979: 不是 GROUP BY 表示式

以上程式碼在執行過程中出現錯誤,是因為:

1. 如果程式中使用了分組函式,則在以下兩種情況下可以正常查詢結果:

      程式中存在了GROUP BY,並指定了分組條件,這樣可以將分組條件一起查詢出來

      如果不使用GROUP BY,則只能單獨地使用分組函式

2.使用分組函式時,查詢結果列不能出現分組函式和分組條件之外的欄位

綜上所述,我們在進行分組統計查詢時有遵循這樣一條規律:

出現在欄位列表中的欄位,如果沒有出現在組函式中,就必定出現在GROUP BY 語句的後面

-- 統計出每個部門的最高工資,及最高工資的僱員姓名
select deptno, ename,sal from emp where sal in(select max(sal) from emp group by deptno);

-- 查詢出每個部門的部門名稱,及每個部門的僱員人數
select d.dname, count(e.empno)
from emp e, dept d
where e.deptno = d.deptno
group by d.dname

求出平均工資大於2000的部門編號和平均工資

初學者很容易錯誤地寫成將工資大於2000的條件寫在where的後面

SELECT deptno,avg(sal)  FROM emp  WHERE avg(sal)>2000   GROUP BYdeptno<span style="font-family:SimSun;"></span>

系統出現如下錯誤提示:

ORA-00934: 此處不允許使用分組函式

-- 求出平均工資大於2000的部門編號和平均工資
select e.deptno, avg(sal)
from emp e, dept d
where e.deptno = d.deptno
having avg(sal) > 2000
group by e.deptno;

規則:WHERE 只能對單條記錄限制(過濾),having是對分組進行過濾

分組函式只能在分組中使用,不能在WHERE語句之中出現,如果要指定分組條件,則只能通過第二種條件的指令:HAVING

-- 顯示非銷售人員工作名稱以及從事同一工作僱員的月工資總和,並且要滿足從事同一工作的僱員的月工資合計大於$5000,輸出結果按月工資合計升序排列
select e.job, sum(e.sal) sum_sal
from emp e
where e.job <> 'SALESMAN'
group by e.job
having sum(e.sal) > 5000
order by sum_sal;

分組的簡單原則:
     只要一列上存在重複內容才有可能考慮到用分組查詢

注意:

     分組函式可以巢狀使用,但是在組函式巢狀使用的時候不能再出現分組條件的列名

例:求平均工資最高的部門編號、部門名稱、部門平均工資

第一步:

select deptno, avg(sal) from emp group by deptno;

第二步:

select deptno, max(avg(sal)) from emp group by deptno;
ORA-00937: 不是單組分組函式

第三步:去掉查詢結果中的deptno列

select max(avg(sal)) from emp group by deptno;


逐步完成後:

select d.deptno, d.dname, t.avg_sal
  from dept d,
   (select deptno,avg(sal) avg_sal
      from emp
       group by deptno having avg(sal)=
          (select max(avg(sal)) from emp group by deptno) 
   ) t
where t.deptno=d.deptno;








相關推薦

函式分組統計

分組函式 SQL中常用的分組函式     Count(): 計數     Max():求最大值     Min():求最小值     Avg():求平均值     Sum():求和 -- 統計

Numpy 內建函式基本統計功能

a=np.arange(6) np.cos(a) np.exp(a) np.sqrt(a) 基本統計功能 a=np.random.randint(1,5,6) a.sum() a.mean()平均值 a.std()方差 a.min()最小值 a.max()

Pandas分組統計函式:groupby、pivot_tablecrosstab

利用python的pandas庫進行資料分組分析十分便捷,其中應用最多的方法包括:groupby、pivot_table及crosstab,以下分別進行介紹。 0、樣例資料 df = DataFrame({'key1':['a','a','b','b','a

Oracle 分組統計,抽取每前十

order by 編號 用戶名 ldb In 行業 partition like ber /**2018年6月14日 潮州ORACEL 統計2017年用電量,按行業分類抽取用電量前十*/select * from (select t.yhbh 用戶編號,

SQL的聚合函式分組、子查詢組合查詢用法

聚合函式: SQL中提供的聚合函式可以用來統計、求和、求最值等等。 分類: –COUNT:統計行數量 –SUM:獲取單個列的合計值 –AVG:計算某個列的平均值 –MAX:計算列的最大值 –MIN:計算列的最小值 首先,建立資料表如下:

python序列之元概念相關函式總結(一)

元組是序列的一種,元組是不可變序列(不能修改,替換),但可進行查詢,增添;元組的建立語法很簡單:用逗號分隔一些值,用圓括號括起來,元組就建立了。 1.先來一個簡單的元組:(圓括號也可以不帶) tou

ORACLE:分組統計函式(COUNT()、SUM()、AVG()、MAX()、MIN())的使用

知識點: 統計函式: COUNT()、SUM()、MIN()、MAX()、AVG() 這些統計函式是允許和其它函式巢狀的 例:統計出企業員工的平均僱傭年限 以上的幾個操作函式,在表中沒有資料的時候,只要COUNT()函式會返回結果,其它都是Null

mongodb aggregate按日期分組統計spring mongo實現

如需轉載請註明出處: mongodb aggregate按日期分組統計及spring mongo實現 實現的需求 傳入毫秒級開始時間戳和結束的時間戳,根據當前狀態currentStatus.status和當前狀態時間currentStatus.datetime進行按日統計,缺少數

第一章 統計學習方法概論 —— 第1~3節 統計學習監督學習的簡介、損失函式風險函式的公式化表達

關於統計學習方法的知識,參考書《統計學習方法》,李航著,清華大學出版社。 所有章節的符號表示、公式表示都是統一化的。 第一章 統計學習方法概論 第一節 統計學習 一、概念 所謂統計學習,指的是基於已知資料構建統計模型,從而對未知資料進行預測。 二、分類 監督學習(super

MYSQL基礎上機練習題(二)對資料指定列查詢、條件查詢、查詢結果排序、聚集函式查詢、分組統計查詢

實驗目標:1.掌握指定列或全部列查詢2.掌握按條件查詢3.掌握對查詢結果排序4.掌握使用聚集函式的查詢5.掌握分組統計查詢一、請完成書中實驗7.1,並完成以下問題。1.查詢所有學生的姓名及其出生年份回答以下問題:SQL語句請截圖① 觀察查詢的資料,若年齡不為空是否能求出出生年

mysql 分組統計 內按時間倒序

類如 有一個帖子的回覆表,posts( id , tid , subject , message ,  dateline ) , id 為 自動增長欄位, tid為該回復的主題帖子的id(外來鍵關聯),  subject 為回覆標題, message 為回覆內容, dateline 為回覆時間,用UNIX 時

大資料實戰:基於Spark SQL統計分析函式分組TopN

做大資料分析時,經常遇到求分組TopN的問題,如:求每一學科成績前5的學生;求今日頭條各個領域指數Top 30%的頭條號等等。Spark SQL提供了四個排名相關的統計分析函式: dense_rank() 返回分割槽內每一行的排名,排名是連續的。 rank() 返回分割槽

R語言︱資料分組統計函式族——apply族用法與心得

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~———————————————————————————筆者寄語:apply族功能強大,實用,可以代替很多迴

sql:分組統計時的查詢效率

 一張user表 裡面有id、國籍、出生日期等欄位 現在要統計各個國家成年的人有多少、未成年的人有多少 結果如下圖所示  第一種寫法: SELECT    gjname, (select count(0) from criminal_base_info where g

C++呼叫 python 函式返回值的處理【元,字串...】

http://www.cnblogs.com/DxSoft/archive/2011/04/01/2002676.html Python 指令碼  py_test.py : #coding:utf-8 def get_int( ): a = 10 b =

SQL語句聚合函式分組、子查詢組合查詢

執行列、行計數(count): 標準格式 SELECT COUNT(<計數規範>) FROM <表名> 其中,計數規範包括: - * :計數所有選擇的行,包括NULL值; - ALL 列名:計數指定列的所有非空值行,如果不寫,預設為ALL; - DISTINCT 列名:計數

jdk1.8新特性 分組統計格式化

package com.lixy.practice; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * Created

SQL中的分組函式

組函式是將一組作為整體計算,每組記錄返回一個結果 avg([distinct|all]expr):計算多行expr平均值,其中expr可以是變數、常量或者資料列 count(distinct|all

Oracle分組統計,rollup函式使用示例

要查詢的表結構以及測試資料如下:rollup_test_tableyyyyMMcum_user(累計使用者)new_user(新使用者)2018/1862018/286分組統計並計算新使用者佔比的查詢sql:select     nvl(yyyyMM,'總計') yyyyMM

SQL腳本去重分組統計

數據 values name var logs 記錄 寫入 varchar 分享 需求:首先有一張表記錄學生姓名、科目和成績,然後模擬插入幾條數據,腳本如下: create table score ( Name nvarchar(20),--姓名