2017-10-17 16 views
0

enter image description hereSQLのグループ化平均

こんにちは!私はSQLに新しいです。私は正しくavgとsum関数を使用して問題を抱えています。上記のデータベースで作業しています。私は、各映画スターの平均利益を見つける必要があるが、彼らの利益の合計は> 200

SELECT MovieStar.sname, avg(profit) From MovieStar, Movie 
GROUP BY sname 
HAVING sum(Movie.profit) > 200 

ある場合にのみ、平均出力だけは私が試してみて、これを理解するためにSQLフィドルを使用していますが、それはそうですそれぞれの俳優ではなく、全利益のコラムの平均を返すことができますが、私は何が間違っているのか分かりません。どのように私はこれにアプローチすることができます私はすべての利益の列の平均ではなく、各俳優の平均を得ることができますか? Hereは私が作ったSQLフィドルです。前もって感謝します!

+0

あなたは俳優によってグループがあまりにもする必要がありますか?ランニングアベレージだけを使用している場合は、ウィンドウ関数も参照してください。 –

+0

は 'GROUP BY sname'とは違いますか?それらを名前でグループ化しますか? – helloworld

+0

あなたはjoin条件も実際のJOINもありません。だから、すべての星は**映画ごとにペアになっています。 – Uueerdo

答えて

3

クエリがCROSS JOIN操作、つまりすべてのムービーを各moviestarにマッチさせるデカルト積を実行しているようです。特定の映画にmoviestarをマッチさせたいと思うようです。starsinテーブルを使用して(おそらく)マッチを得ることができます。

旧式のコンマ演算子をジョイン操作することをお勧めします。代わりに新しいJOINキーワードを使用してください。また、結合述部をWHERE節の代わりに適切なON節に入れます。

また、ベストプラクティスは修飾することです。すべて列参照。あいまいさを排除する必要がない場合でも、新しい列が追加されたときにクエリが中断されるのを防ぎ、将来の読者を助けます...テーブル定義を見て、テーブルからどの列が来るか把握しなければならない。

私はあなたがこのような何かをしたいと思う:

SELECT ms.sname 
-- , ms.sno 
     , AVG(m.profit) AS avg_profit 
-- , SUM(m.profit) AS tot_profit 
    FROM MovieStar ms 
    JOIN StarsIn si 
     ON si.sno = ms.sno 
    JOIN Movie m 
     ON m.mno = si.mno 
    GROUP BY ms.sno, ms.sname 
    HAVING SUM(m.profit) > 200 
    ORDER BY AVG(m.profit) DESC 
+0

実際、OPと同じように[誤ってクロス結合を実行する](https://stackoverflow.com/a/317465/1422451)ように、暗黙的な結合は避けなければなりません。 – Parfait

+0

お互いにありがとう!私はクロスジョイン操作がそのように起こるかもしれないことを知らなかったが、それは理にかなっている。なぜこのような状況でWHEREの代わりにONを使用することを選んだのですか?私の頭の中では、彼らは同じもののように見える、または少なくとも密接に関連している。 – helloworld

+0

私は、行 "条件"をON句に入れ、他の条件をWHERE句に入れることを好みます。これは必須条件ではなく、MySQLは気にしません。これは単なるスタイルコンベンションであり、好みです。私は、読者がWHERE節のすべての条件を調べるのではなく、8つのテーブルを結合してON句の条件を持つことが読者にとって簡単だと思います。 ON句に条件を設定すると、OUTER JOINを実行するときにも簡単になります。 – spencer7593

関連する問題