2017-04-11 11 views
0

私はこのようなテーブルがあります:私はSTUDENT_IDを表示したいと80グループの競合はどこですか?

よりも高く、学生の平均スコアは、私が欲しいの出力は、このようなものです

mysql> select * from studentscore; 
+------------+-----------+-------+ 
| student_id | cource_id | score | 
+------------+-----------+-------+ 
|   1 |   1 | 80 | 
|   1 |   2 | 90 | 
|   1 |   3 | 85 | 
|   1 |   4 | 78 | 
|   2 |   2 | 53 | 
|   2 |   3 | 77 | 
|   2 |   5 | 80 | 
|   3 |   1 | 71 | 
|   3 |   2 | 70 | 
|   3 |   4 | 80 | 
|   3 |   5 | 65 | 
|   3 |   6 | 75 | 
|   4 |   2 | 90 | 
|   4 |   3 | 80 | 
|   4 |   4 | 70 | 
|   4 |   6 | 95 | 
|   5 |   1 | 60 | 
|   5 |   2 | 70 | 
|   5 |   5 | 80 | 
|   5 |   6 | 69 | 
|   6 |   1 | 76 | 
|   6 |   2 | 88 | 
|   6 |   3 | 87 | 
|   7 |   4 | 80 | 
|   8 |   2 | 71 | 
|   8 |   3 | 58 | 
|   8 |   5 | 68 | 
|   9 |   2 | 88 | 
|   10 |   1 | 77 | 
|   10 |   2 | 76 | 
|   10 |   3 | 80 | 
|   10 |   4 | 85 | 
|   10 |   5 | 83 | 
|   11 |   3 | 80 | 
|   12 |   4 | 99 | 
|   13 |   5 | 74 | 
+------------+-----------+-------+ 

+------------+-------------------+ 
| student_id | Average   | 
+------------+-------------------+ 
|   1 |    83.25 | 
|   4 |    83.75 | 
|   6 | 83.66666666666667 | // and how can I make this result shorter like 83.67? 
|   7 |    80 | 
|   9 |    88 | 
|   10 |    80.2 | 
|   11 |    80 | 
|   12 |    99 | 
+------------+-------------------+ 

私は以下のコード

mysql> select student_id, avg(score) as average_score 
    -> from  studentscore 
    -> group by student_id 
    -> where avg(score) >= 80; 

し、それを試してみました私に構文エラーを与えました。

where節はgroup by節の前に置く必要がありますが、where節はgroup by節の結果に依存するため、できません。位置を切り替えると別のエラーが発生します"グループ機能の無効な使用")。

私が望むテーブルを手に入れる方法を教えてもらえますか? havingは、フィルタ後のグループ化を適用するのに対し、グループ化は、行われた前

+0

ここであなたはどのデータベースを使用していますか? –

+0

@TimBiegeleisen私はMySQLを使用しています。 –

+0

@Tim Biegeleisen申し訳ありませんが、私はそのことを忘れて –

答えて

3

使用。

select student_id, round(avg(score), 2) as average_score 
from studentscore 
group by student_id 
having average_score >= 80; 
+0

ありがとう!私はちょうどsqlを学び始めたので、「持っている」ことは知らなかった... –

0
select student_id, avg(score) as average_score 
    from  studentscore 
    group by student_id 
    having avg(score) >= 80; 
+0

コードをありがとう! –

+0

あなたは投票をあきらめることができます...ありがとう@ C.G。 – Chanukya

+0

私は先生でした。私は15未満の評判を持っているので公開しません。 –

0

whereがあなたのデータにフィルタを適用し、「どこ」の代わりに「持つ」

+0

SQL Serverでは、あなたは 'HAVING'節で選択されたエイリアスを使うことはできません。しかし、これはMySQLでも動作します。 –

1

havingの代わりwhereを使用します。あなたも頼むようround(,2)がフォーマットされます。 ここに違いがあります:あなたは、各グループ

し、あなたの中に適用されます述語を書くことができたと、各行

  • に適用される述語を書くことができる場所と

    1. ケースでは、2番目のソリューションが機能する唯一のソリューションです。

  • 関連する問題