2016-11-18 16 views
0

私は学生データとその成績を格納するテーブル(stu_grades)を持っています。条件が満たされた回数を確認してください

たとえば、そのテーブルの各学生は「A」と「B」などを取得します。

どうすればよいですか?私の気持ちは一番上の行を使用することです?私はクエリを構築することはできません。

stu_grades

stu_ID|grade1|grade2|Grade3 
    1  A  A  C 
    2  B  B  B 
    3  C  C  A 
    1  C  A  C 

同じ学生が同じ学年、あるいは異なるグレードのテーブルに複数回発生する可能性があります。

私は特にグレードだから最終的な出力は以下のようにする必要があります以上の3倍以上

を登場している場所を確認したい:

Stu_ID|Grade|Count 
1  A  3 
1  C  3 
2  B  3 
3  C  2 
3  A  1 
+2

は単に 'GROUP BY'を行います! – jarlh

+0

@jarlhは編集した投稿を編集しました – healthiq

+0

またHAVINGを使用しています – jarlh

答えて

1

Group BYを使用します。

SELECT stu_ID, Grade, GradeCount 
FROM stu_grades 
LEFT OUTER JOIN 
(
    SELECT Grade, COUNT(Grade) GradeCount 
    FROM stu_grades 
    GROUP BY Grade 
)tb 
ON tb.Grade= stu_grades.Grade 
+0

申し訳ありませんが私はそれをはっきりさせて、追加のコメントを追加しました。 – healthiq

+0

申し訳ありませんが、私はあなたの欲求のために私の答えを更新しました。 – Zeina

0

GROUP BYとHAVINGを使用してこれを解決できます。

SELECT grade, COUNT(grade) FROM stu_grades GROUP BY grade HAVING COUNT(grade) > 3 
+0

私はそれをはっきりさせず、追加のコメントを追加して何が必要なのかを示しました。 – healthiq

+0

これは助けることを願っています –

+0

しかし、私は各生徒が欲しいです – healthiq

0

あなたは、1学年につき1人の学生の成績が必要だと述べました。あなたはstu_idとグレードの両方でグループ化する必要があります。

SELECT stu_id, grade, COUNT(grade) GradeCount 
    FROM stu_grades 
    GROUP BY stu_id, grade 
    HAVING COUNT(grade) > 3 
+0

投稿が変更されました。 – healthiq

0

1)あなたのデータを正規化:

select stu_id, grade 
from stu_grades, unnest(array[grade1, grade2, grade3]) as g(grade); 

2)今のところ、それは簡単です:

select stu_id, grade, count(*) 
from stu_grades, unnest(array[grade1, grade2, grade3]) as g(grade) 
group by 1, 2 order by 1, 2; 
関連する問題