Oracle SQL - 比较WHERE中的AVG函数

时间:2013-11-28 23:54:13

标签: sql oracle plsql

我正在尝试为作业编写一些Oracle SQL脚本。除了一部分之外,我已经成功地完成了所有工作。总而言之,如果表A中1列的平均值大于表B中另一列的平均值,我必须显示来自2个表的数据。我意识到你不能在WHERE子句或HAVING子句中包含AVG函数,因为它似乎无法正确访问数据(从我读过的内容)。当我排除这个子句时,脚本正确执行,所以我相信没有其他错误。

我尝试按如下方式编写它,但我得到的错误是ORA-00936:缺少表达式,它就在>之前。标志。我认为这可能是由于支架放置不当造成的,但我没有尝试解决这个问题。这是我的尝试:

SELECT l.l_category, SUM(r.r_sold), AVG(l.l_cost)
FROM promos l 
    INNER JOIN sales r 
        ON r.promo_id = l.promo_id
GROUP BY l.l_category
HAVING (SELECT AVG(l.l_cost) OVER (PARTITION BY l.l_cost)) > 
    (SELECT AVG(r.r_sold)   OVER (PARTITION BY r.r_sold));

我尝试在没有OVER(PARTITION BY ...)的情况下执行此操作以及将其放入WHERE子句但是它没有解决错误。我很确定我需要以某种方式将它放入SELECT语句中,但我不知所措。

1 个答案:

答案 0 :(得分:1)

在HAVING子句中应用聚合函数时,不需要使用OVER子句。只需使用自己的聚合函数。

SELECT l.l_category, SUM(r.r_sold), AVG(l.l_cost)
FROM promos l 
    INNER JOIN sales r 
        ON r.promo_id = l.promo_id
GROUP BY l.l_category
HAVING HAVING AVG(l.l_cost) > AVG(r.r_sold)