1. 程式人生 > >group by,having,order by小結--teradata資料庫

group by,having,order by小結--teradata資料庫

Group By
利用GROUP BY和聚合函式可以實現分組累計。舉例來說,如果要求顯示各
個部門的薪水合計,可以使用下面的語句。
SELECT department_number
,SUM (salary_amount)
FROM employee
GROUP BY department_number;
 
結果:
department_number Sum(salary_amount)
401 74150.00
403 80900.00
301 58700.00
 
需要注意的是,在SELECT子句中不作分組累計的所有欄位必須出現在
GROUP BY子句中,否則會返回如下出錯資訊:
ERROR: 3504 Selected non-aggregate values must be part of the associated group.
 
以上例來說,Department_Number欄位未作累計,因此它必須出現在GROUP
BY子句中。這條基本規則必須牢記。
 
WHERE子句和GROUP BY子句


WHERE子句和GROUP BY子句同時使用時,GROUP BY只對符合WHERE限
制的資料記錄進行分組聚合計算。換言之,在作真正的聚合計算之前,WHERE子
句將不符合條件的資料記錄剔除了

 
例:部門401和403的合計薪水是多少?
SELECT department_number
,SUM (salary_amount)
FROM employee
WHERE department_number IN (401, 403)
GROUP BY department_number
;
 
結果:
department_number Sum (salary_amount)
403 80900.00
401 74150.00
 
GROUP BY和ORDER BY

在GROUP BY後加上ORDER BY,可以使得分組統計按照指定的秩序來顯
示。例如,按部門編號順序顯示部門人數、合計薪水、部門最高薪水、部門最底薪
水和部門平均薪水,可以使用下面的SQL語句:
SELECT department_number (TITLE 'DEPT')
,COUNT (*) (TITLE '#_EMPS')
,SUM (salary_amount) (TITLE 'TOTAL')
(FORMAT 'zz,zzz,zz9.99')
,MAX (salary_amount) (TITLE 'HIGHEST')
(FORMAT 'zz,zzz,zz9.99')
,MIN (salary_amount) (TITLE 'LOWEST')
(FORMAT 'zz,zzz,zz9.99')
,AVG (salary_amount) (TITLE 'AVERAGE')
(FORMAT 'zz,zzz,zz9.99')
FROM employee
GROUP BY department_number
ORDER BY department_number
;
 
結果如下:
DEPT #_EMPS TOTAL HIGHEST LOWEST AVERAGE
301 3 116,400.00 57,700.00 29,250.00 38,800.00
401 7 245,575.00 46,000.00 24,500.00 35,082.14
403 6 233,000.00 49,700.00 31,000.00 38,833.33
 
上面的SQL語句也可以寫成:

SELECT department_number AS DEPT
,COUNT (*) AS #_EMPS
,CAST ( SUM (salary_amount) AS FORMAT 'zz,zzz,zz9.99')
AS TOTAL
,CAST ( MAX (salary_amount) AS FORMAT 'zz,zzz,zz9.99')
AS HIGHEST
,CAST ( MIN (salary_amount) AS FORMAT 'zz,zzz,zz9.99')
AS LOWEST
,CAST ( AVG (salary_amount) AS FORMAT 'zz,zzz,zz9.99')
AS _AVERAGE)
FROM employee
GROUP BY department_number
ORDER BY department_number;
 
由於AVERAGE本身是一個關鍵詞,所以在上面的例子中在它前面加上下劃線
以便區分。
當對多個欄位進行分組統計時,GROUP BY只能產生一個級別的彙總。例
如:對部門401和403按照工作程式碼分組統計薪水。
SELECT department_number
,job_code
,SUM (salary_amount)
FROM employee
WHERE department_number IN (401, 403)
GROUP BY department_number, job_code
ORDER BY 1, 2;
 
結果:
department_number job_code SUM (salary_amount)
401 411100 37850.00
401 412101 107825.00
401 412102 56800.00
401 413201 43100.00
403 431100 31200.00
403 432101 201800.00
 
從這個例子可以看到,當GROUP BY中有多個欄位時,它只能產生一個級別
的彙總,而且是按照最後一個欄位
(這裡是job_code)來進行彙總。

 
GROUP BY和HAVING條件限定
HAVING條件子句是和GROUP一起使用的,用來對分組統計的結果進行限
定,只返回滿足其條件的分組統計結果。
舉例來說,按部門編號順序顯示部門人數、合計薪水、部門最高薪水、部門
最低薪水和部門平均薪水,條件是隻顯示部門平均薪水小於36000的部門。
SELECT department_number (TITLE 'DEPT')
,COUNT (*) (TITLE '#_EMPS')
,SUM (salary_amount) (TITLE 'TOTAL')
(FORMAT 'zz,zzz,zz9.99')
,MAX (salary_amount) (TITLE 'HIGHEST')
(FORMAT 'zz,zzz,zz9.99')
,MIN (salary_amount) (TITLE 'LOWEST')
(FORMAT 'zz,zzz,zz9.99)
,AVG (salary_amount) (TITLE 'AVERAGE')
(FORMAT 'zz,zzz,zz9.99')
FROM employee
GROUP BY department_number
HAVING AVG (salary_amount) < 36000;
 
結果:
DEPT #_EMPS TOTAL HIGHEST LOWEST AVERAGE
401 7 245,575.00 46,000.00 24,500.00 35,082.14
 

GROUP BY小結
在進行分組聚合操作時,要特別注意以下各點:
1、WHERE:用來限定參與分組聚合運算的表的資料記錄,只有滿足條件的
資料記錄才會被選中參與分組聚合。
2、GROUP BY:將符合WHERE條件子句的記錄進行分組
3、HAVING:用來限定可以返回的分組聚合的結果
4、ORDER BY:用來指定結果的輸出順序