调用聚合函数的错误用法(转)

如果查询中包含一个聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUP BY子句中;否则就会出现下面的错误:ORA-00937: not a single-group group function。例如,下面这个查询选择product_type_id列和AVG(price),但是却没有使用一个包含product_type_idGROUP BY子句:

 SQL> SELECT product_type_id, AVG(price)
2 FROM products;
SELECT product_type_id, AVG(price)
*
ERROR at line 1:
ORA-00937: not a single-group group function

之所以会出现这个错误是因为数据库不知道怎样在结果集中处理product_type_id列。考虑一下:这个查询既试图使用AVG聚合函数对多行记录进行操作,却又试图从每行中获得product_type_id列的值;这两个操作是不可能同时完成的。此时必须提供一个GROUP BY子句告诉数据库将product_type_id列相同的行分组在一起,然后数据库就可以将这些组中的行传递给AVG函数。

警告:

如果查询中包含聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUP BY子句中。

还有,不能在WHERE子句中使用聚合函数来限制行。如果这样做,就会出现下面的错误:ORA-00934: group function is not allowed here。例如:

 SQL> SELECT product_type_id, AVG(price)
2  FROM products
3  WHERE AVG(price) > 20
4  GROUP BY product_type_id;
WHERE AVG(price) > 20
*
ERROR at line 3:
ORA-00934: group function is not allowed here

之所以会出现这个错误是因为WHERE子句只能用来对单行而不是行组进行过滤。要过滤行组,可以使用HAVING子句。

载自http://book.51cto.com/art/200812/101586.htm

转载于:https://www.cnblogs.com/shkkhd/archive/2009/02/10/1387222.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值