使用子查询列出大于平均值的列表

时间:2016-07-27 19:38:06

标签: sql oracle-sqldeveloper

我所拥有的是一张具有书名价格的表格。我要做的是列出价格高于平均价格的书籍。到目前为止我所拥有的是:

SELECT TITLES.PRICE, AVG(TITLES.PRICE) AS "KOMPARE"
FROM TITLES,
            (SELECT PRICE, AVG(PRICE)
            FROM TITLES
            GROUP BY Price) subquery1

WHERE TITLES.PRICE = subquery1.PRICE
AND subquery1.PRICE > TITLES.KOMPARE
GROUP BY TITLES.PRICE;

我得到的错误是TITLES.KOMPARE是无效的标识符。我不确定为什么我在第一个select语句中定义它。而且我不能将AVG(TITLES.PRICE)放在AND语句中。对于能给我一些建议的人,我将永远感激不尽!谢谢。

仅供参考我的表名是TITLES,而且这些书的价格都是PRICE。

3 个答案:

答案 0 :(得分:1)

对于聚合函数,您应该使用having和no alias

SELECT TITLES.PRICE, AVG(TITLES.PRICE) AS "KOMPARE"
FROM TITLES,
        (SELECT PRICE, AVG(PRICE)
        FROM TITLES
        GROUP BY Price) subquery1
WHERE TITLES.PRICE = subquery1.PRICE
GROUP BY TITLES.PRICE
HAVING TITLES.PRICE > AVG(TITLES.PRICE)

可能是你正在寻找像

这样的事情
select  TITLES.PRICE,select AVG(TITLES.PRICE) from TITLES   )
from TITLES   
where TITLES.PRIVE  > (select AVG(TITLES.PRICE) from TITLES   );

答案 1 :(得分:0)

您的查询毫无意义,在按PRICE分组时获得平均价格?

SELECT TITLE.*
FROM TITLES
CROSS JOIN
  (
    SELECT AVG(PRICE) AS avgPrice
    FROM TITLES
  ) subquery1
WHERE TITLES.PRICE > avgPrice
;

或更好:

SELECT *
FROM TITLES
WHERE TITLES.PRICE >
  (
    SELECT AVG(PRICE) AS avgPrice
    FROM TITLES
  )
;

答案 2 :(得分:0)

你可以一起工作:

SELECT
  price
  , ROUND((SELECT AVG(price) FROM Titles), 2) AS kompare
FROM Titles
WHERE price > (SELECT AVG(price) FROM Titles)
;

您可能想要从标题中检索更多列 - 这是您编写语句时无法实现的。 (但为什么你会GROUP BY首先定价?)

你甚至可以列出差异:

SELECT
  Titles.*
  , ROUND(price - (SELECT AVG(price) FROM Titles), 2) AS difference
FROM Titles
WHERE price > (SELECT AVG(price) FROM Titles)
;

请评论是否需要调整/进一步详细说明。