-1

私はこのような記録を持っています:

name       price    class
Horse      5000     mammal
Cat        3000     mammal
penguin    2000     bird
chicken    1000     bird
turtle     4000     reptile
snake      2400     reptile

次の列を持つテーブルが必要です:name、price、class、priceavg_of_class例:

name       price    class    priceavg_of_class
Horse      5000     mammal   4000
Cat        3000     mammal   4000
penguin    2000     bird     1500
chicken    1000     bird     1500
turtle     4000     reptile  3200
snake      2400     reptile  3200

SQLを使用してこの問題を解決するにはどうすればよいですか?

私はこのコードを試しました:

SELECT animal.name, animal.price, animal.class, 
(SELECT Avg(animal.price) FROM animal WHERE class = animal.class) AS Avg
FROM animal

しかし、それはうまくいかないようです。各レコードで同じ平均値を取得します。

4

3 に答える 3

3

明示的な結合を使用してこれを行う方法は次のとおりです。

select name, price, class, avgprice
from animal t inner join
     (select class, avg(price) as avgprice
      from animal t
      group by class
     ) tavg
     on t.class = tavg.class

クエリの問題(代替ソリューション)は、変数のスコープです。すべての列のエイリアスを含めると、次のように機能します。

SELECT a.name, a.price, a.class, 
       (SELECT Avg(a2.price) FROM animal a2 WHERE a.class = a2.class
       ) AS Avg
FROM animal a

あなたが持っていたclass = animal.classanimal最も近いスコープは列参照を解決するために使用されるスコープであるため、これらは両方とも内部クエリのテーブルを参照します。

于 2013-03-21T17:19:16.860 に答える
1

サブクエリと集計関数を使用する

Select name, price, class, 
    (select Avg(price) From table
     where class = t.class) avgPrice
From table t
于 2013-03-21T17:07:51.657 に答える
0
select name,price,class,avg(price) over (partition by class)
from tab;

SELECT m.name,
  m.price,b.class,b.price
  FROM tab m,
  (SELECT class,AVG(price) price FROM tab GROUP BY class
  ) b
  where m.class=b.class
于 2013-03-21T18:32:30.290 に答える