2

我开始学习 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,所以我不能使用变量或类似的东西..

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

4

4 回答 4

5

On Sql server, you can use the avg aggragate inside the windowing function row_number

 with m as(
    select genre, 
         avg(price) cost, 
         row_number() over(order by avg(price) desc) rw
    from books
    group by genre
 )
 select * from m
 where rw=1
于 2012-11-08T22:58:04.273 回答
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)

于 2012-11-08T22:30:14.937 回答
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 中也有类似的结构)

于 2012-11-08T22:48:18.353 回答
0
select top 1
  genre,
  avg(b.price) as cost
from books
group by
  genre
order by
  cost desc
于 2012-11-08T22:48:53.840 回答