SQL命令获取最大值的字段,而不进行两次选择

时间:2012-11-08 22:24:29

标签: sql oracle max

我开始学习SQL并且我正在进行这项练习:我有一个“书籍”表,其中包含每本书的信息(包括价格和流派ID)。 我需要得到平均价格最高的类型的名称。我想我首先需要按类型对价格进行分组,然后检索最高的名称..

我知道我可以通过以下方式获得结果GENRE VS COST:

select b.genre, 
       round(avg(b.price),2) as cost 
from books b 
group by b.genre;

我的问题是,要从该结果中获得AVG价格最高的类型,我是否必须制作:

select aux.genre 
from (
   select b.genre, 
          round(avg(b.price),2) as cost 
   from books b 
   group by b.genre
) aux 
where aux.cost = (select max(aux.cost) 
                  from (
                      select b.genre, 
                             round(avg(b.price),2) as cost 
                      from books l 
                      group by b.genre
                  ) aux);

这是不好的做法还是不是另一种方式?我得到了正确的结果,但是我不能轻易地创建两次相同的选择。

我没有使用PL SQL,所以我不能使用变量或类似的东西..

任何帮助将不胜感激。 提前谢谢!

3 个答案:

答案 0 :(得分:1)

with avg_price as (
   select b.genre, 
          round(avg(b.price),2) as cost 
   from books b 
   group by b.genre
)
select genre 
from avg_price
where cost = (select max(cost) from avg_price);

(这是ANSI标准SQL,适用于所有现代DBMS)

答案 1 :(得分:0)

在MS-SQL中,您可以这样做:

SELECT TOP 1 genre, ROUND(AVG(price),2) AS cost 
FROM books
GROUP BY genre
ORDER BY ROUND(AVG(price),2) DESC

(TOP子句是特定于MS-SQL的,但在其他DBMS中有类似的构造)

答案 2 :(得分:0)

select top 1
  genre,
  avg(b.price) as cost
from books
group by
  genre
order by
  cost desc