2013-11-28 83 views
0

我正在嘗試爲一個任務編寫幾個Oracle SQL腳本。除了一部分,我已經設法使其全部起作用。總而言之,如果表A中1列的平均值大於表B中另一列的平均值,我必須顯示2個表中的數據。我知道你不能將AVG函數包含在WHERE子句或HAVING子句中,因爲它似乎不能正確訪問數據(從我讀過的)。當我排除這個條款時,腳本正確執行,所以我相信沒有其他錯誤。Oracle SQL - 在哪裏比較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語句中,但我不知所措。

+4

只需使用'HAVING AVG(l.l_cost)> AVG(r.r_sold)' – cha

+0

@cha謝謝!你的建議非常完美!我想我過於複雜的情況。 –

+0

你可以使用'WHERE(Select ...)>'但你必須使用正確的語句,然後像'WHERE(select * from dual)> ...' – Armunin

回答

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) 
+0

謝謝!我已經接受你的答案。 –