2

私はSQLを学び始めており、この演習に取り組んでいます。すべての本の情報(価格とジャンルIDを含む)を保持する「本」テーブルがあります。平均価格が最も高いジャンルの名前を取得する必要があります。まず、ジャンルごとに価格をグループ化してから、最高の名前を取得する必要があると思います。

次のようにして、GENREVSCOSTの結果を得ることができることを知っています。

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);

それは悪い習慣ですか、それとも別の方法はありませんか?正しい結果が得られますが、同じ選択範囲を2回作成することに不安があります。

PL SQLを使用していないため、変数などを使用できません。

どんな助けでもありがたいです。前もって感謝します!

4

4 に答える 4

5

SQLサーバーでは、ウィンドウ関数row_number内でavg集計を使用できます

 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 に答える