Oracle DB 對行進行分組-group by、having

來源:互聯網
上載者:User

  • 建立資料群組
所有組函數都將表當作一個大型的資訊組。但是,有時需要將此資訊表分成幾個較小的組。可以通過使用GROUP BY子句完成此任務。 
  • 建立資料群組:GROUP BY子句的文法
可以通過使用GROUP BY子句將表中的行分成較小的組。SELECT column, group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][ORDER BY column];  可以使用GROUP BY子句將表中的行分成組。然後,可以使用組函數返回每個組的匯總資訊。在該文法中:group_by_expression 指定某些列,這些列的值確定對行進行分組的基準準則• 除非在GROUP BY子句中指定了單個列,否則即使在SELECT子句中包括組函數,也不能選擇單個結果。如果未在GROUP BY子句中包括列的列表,則會收到一條錯誤訊息。• 通過使用WHERE子句,可以在將行分成多個組之前先排除某些行。• 必須將列包括在GROUP BY子句中。• 不能在GROUP BY子句中使用列別名。 
  • 使用GROUP BY子句
SELECT列表中未出現在組函數中的所有列都必須包含在GROUP BY子句中。hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ; DEPARTMENT_ID AVG(SALARY)------------- -----------100 8601.3333330 4150700020 950070 1000090 19333.3333110 1015450 3475.5555640 650080 8955.8823510 440060 5760 12 rows selected. 使用GROUP BY子句時,應確保將SELECT列表中未出現在組函數中的所有列都包含在GROUP BY子句中。樣本顯示每個部門的部門編號和平均薪金。下面介紹含有GROUP BY子句的SELECT語句是如何進行求值的:• SELECT:子句指定要檢索的列,如下所示:- EMPLOYEES:表中的部門編號列- GROUP BY:子句指定的組中所有薪金的平均值• FROM:子句指定資料庫必須訪問的表:EMPLOYEES表。• WHERE:子句指定要檢索的行。由於沒有WHERE子句,預設情況下會檢索所有行。• GROUP BY:子句指定如何對行進行分組。由於是按部門編號對行進行分組,因此應用於薪金列的AVG函數會計算每個部門的平均薪金。註:要按升序或降序對查詢結果進行排序,請在查詢中包含ORDER BY子句。 
  • 使用GROUP BY子句
GROUP BY列不一定要出現在SELECT列表中。hr@TEST0924> SELECT AVG(salary) FROM employees GROUP BY department_id ; AVG(SALARY)-----------8601.333334150700095001000019333.3333101543475.5555665008955.8823544005760 12 rows selected.  GROUP BY列不一定要出現在SELECT子句中。例如,樣本中的SELECT語句顯示每個部門的平均薪金,但沒有顯示相應的部門編號。但是如果沒有部門編號,結果看起來毫無意義。也可以在ORDER BY子句中使用組函數:hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ORDER BY AVG(salary); DEPARTMENT_ID AVG(SALARY)------------- -----------50 3475.5555630 415010 440060 576040 65007000100 8601.3333380 8955.8823520 950070 10000110 1015490 19333.3333 12 rows selected. 
  • 按多個列進行分組
有時,需要查看組內的各個組的結果。hr@TEST0924> SELECT department_id, job_id, sum(salary) FROM employees GROUP BY department_id, job_id ORDER BY job_id; DEPARTMENT_ID JOB_ID SUM(SALARY)------------- ---------- -----------110 AC_ACCOUNT 8300110 AC_MGR 1200810 AD_ASST 4400...20 rows selected.  此樣本顯示一個報表,其中顯示要付給各個部門中每種職務的薪金總和。EMPLOYEES表首先按部門編號進行分組,然後在各個組中又按職務進行分組。例如,將部門50 中的四個倉儲職員分成一個組,並為該組中的所有倉儲職員產生一個結果(薪金總和)。    
  • 對多個列使用GROUP BY子句
hr@TEST0924> SELECT department_id, job_id, SUM(salary) FROM employees WHERE department_id > 40 GROUP BY department_id, job_id ORDER BY department_id; DEPARTMENT_ID JOB_ID SUM(SALARY)------------- ---------- -----------50 SH_CLERK 6430050 ST_CLERK 5570050 ST_MAN 3640060 IT_PROG 2880070 PR_REP 1000080 SA_MAN 6100080 SA_REP 24350090 AD_PRES 2400090 AD_VP 34000100 FI_ACCOUNT 39600100 FI_MGR 12008110 AC_ACCOUNT 8300110 AC_MGR 12008 13 rows selected.通過列出多個GROUP BY列,可以返回組和子組的匯總結果。GROUP BY子句對行進行分組,但不保證結果集的順序。要對組進行排序,請使用ORDER BY子句。在樣本中,包含GROUP BY子句的SELECT語句按如下方式進行求值:• SELECT子句指定要檢索的列:- EMPLOYEES表中的部門ID- EMPLOYEES表中的職務ID- GROUP BY子句指定的組中所有薪金的總和• FROM子句指定資料庫必須訪問的表:EMPLOYEES表。• WHERE子句將結果集限定為部門ID 大於40 的行。• GROUP BY子句指定應如何對結果行進行分組:- 首先,按部門ID 對行進行分組- 其次,在部門ID 組中按職務ID 對行進行分組• ORDER BY子句按部門ID 對結果進行排序。註:SUM函數將應用於每個部門ID 組的結果集中所有職務ID 的薪金列。另外,請注意,不返回SA_REP 行。此行的部門ID 為NULL,因此不滿足WHERE條件。 更多詳情見請繼續閱讀下一頁的精彩內容:

Oracle分組函數rollup,cube 

Oracle 分組函數用法樣本詳解

Oracle分組函數之ROLLUP魅力  

Oracle分組函數之CUBE魅力

Oracle 分組查詢詳解

 

  • 1
  • 2
  • 下一頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.