Oracle对行进行分组-groupby、having(二)

2014-11-24 09:16:30 · 作者: · 浏览: 2
id, COUNT(last_name) FROM employees; SELECT department_id, COUNT(last_name) FROM employees * ERROR at line 1: ORA-00937: not a single-group group function 必须添加GROUP BY子句,才能对每个department_id对应的姓氏进行计数。
hr@TEST0924> SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id; SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id * ERROR at line 1: ORA-00979: not a GROUP BY expression
要么在GROUP BY中添加job_id,要么从SELECT列表中删除job_id列。

只要在同一个SELECT语句中混合使用单个项(DEPARTMENT_ID) 和组函数(COUNT),就必须包括一个指定这些单个项(本例中为DEPARTMENT_ID)的GROUP BY子句。如果缺少GROUP BY子句,则会出现错误消息“not a single-group group function(不是一个组的组函数)”,而且显示一个指向错误列的星号(*)。可通过添加GROUP BY子句更正第一个示例中的错误: hr@TEST0924> SELECT department_id, count(last_name) FROM employees GROUP BY department_id;
DEPARTMENT_ID COUNT(LAST_NAME) ------------- ---------------- 100 6 30 6 1 20 2 70 1 90 3 110 2 50 45 40 1 80 34 10 1 60 5
12 rows selected.
SELECT列表中不在聚集函数中的任何列或表达式都必须出现在GROUP BY子句中。
在第二个示例中,job_id既不在GROUP BY子句中也不在组函数中,因此将出现“not a GROUP BYexpression(不是GROUP BY表达式)”错误。可通过在GROUP BY子句中添加job_id更正第二个示例中的错误。 hr@TEST0924> SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id, job_id;
DEPARTMENT_ID JOB_ID COUNT(LAST_NAME) ------------- ---------- ---------------- 110 AC_ACCOUNT 1 90 AD_VP 2 50 ST_CLERK 20 ... 20 rows selected.

使用组函数的非法查询 不能使用WHERE子句限定组。 hr@TEST0924> SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id * ERROR at line 1: ORA-00934: group function is not allowed here

可以使用HAVING子句限定组。 不能在WHERE子句中使用组函数。

不能使用WHERE子句限定组。示例中的SELECT语句产生了一个错误,因为该语句使用WHERE子句限定显示平均薪金大于$8,000 的那些部门的平均薪金。但是,通过使用HAVING子句限定组,可以更正该示例中的错误: hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING AVG(salary) > 8000;
DEPARTMENT_ID AVG(SALARY) ------------- ----------- 100 8601.33333 20 9500 70 10000 90 19333.3333 110 10154 80 8955.88235
6 rows selected.
限定组结果 与使用WHERE子句限定所选行的方式相同,可以使用HAVING子句限定组。要在最高薪金大于$10,000 的每个部门中查找最高薪金,需要执行以下操作: 1.通过按部门编号进行分组,查找每个部门的最高薪金。 2.将组限定为最高薪金大于$10,000 的部门。
使用HAVING子句限定组结果 使用HAVING子句时,Oracle Server 将按以下方式对组进行限定: 1. 对行进行分组。 2. 应用组函数。 3. 显示符合HAVING子句的组。 SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column];
可使用HAVING子句指定要显示的组,该子句基于汇总信息进一步限定组。在上述语法中,group_condition用于限定满足指定条件的组的返回行组。使用HAVING子句时,Oracle Server 会执行以下步骤: 1.对行进行分组。 2.对组应用组函数。 3.显示符合HAVING子句中的标准的组。 HAVING子句可放在GROUP BY子句之前,但建议将GROUP BY子句放在前面,因为这样更符合逻辑。应先形成组并计算组函数,然后再对SELECT列表中的组应用HAVING子句。注:WHERE子句限定行,而HAVING子句限定组。
使用HAVING子句 hr@TEST0924> SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ;
DEPARTMENT_ID MAX(SALARY) ------------- ----------- 100 12008 30 11000 20 13000 90 24000 110 12008 80 14000
6 rows selected.
示例显示最高薪金大于$10,000 的部门的部门编号和最高薪金。可以在SELECT列表中使用GROUP BY子句,而不使用组函数。如果根据组函数的结果来限定行,则必须采用GROUP BY子句和HAVING子句。下面的示例显示最高薪金大于$10,000 的部门的部门编号和平均薪金: hr@TEST0924> SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING max(salary)>10000;
DEPARTMENT_ID AVG(SALARY) ------------- ----------- 100 8601.33333 30 4150 20 9500 90 19333.3333 110 10154 80 8955.88235
6 rows select