2016-11-18 90 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

簡單地做了'集團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

您提到您希望爲每個年級的學生分數。你需要通過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;