我正在處理這個查詢:
SELECT s.studentname,
Avg(cs.exam_season_one
cs.exam_season_two
cs.degree_season_one
cs.degree_season_two ) / 4 AS average
FROM courses_student cs
join students s
ON s.student_id = cs.student_id
join SECTION se
ON s.sectionid = se.sectionid
WHERE cs.courses_id = 1
AND ( se.classes_id = 2
OR se.classes_id = 5 )
AND s.studentname LIKE 'm%'
GROUP BY s.studentname
直到這一刻一切正常,但我需要添加最后一個條件,我不知道如何。我需要獲得具有相同平均值的學生我的意思是只有 count(average) > 1 (idk 如果這是正確的) 任何人都知道如何在這個查詢中解決這個問題?PS:我使用oracle。
編輯:
創建表陳述句和示例資料在這里:http : //sqlfiddle.com/#!4/ebf636
試圖更多地解釋問題,因為也許我第一次做錯了!首先,平均值是4列的平均值我期望的輸出是得到屬于class 2或class 5的學生的名字(classes_id = 2,classes_id = 5),他們的名字也應該以MI開頭想要檢查他們在特定課程中的平均水平(course_id = 1),我要問的最后一個條件是我希望獲得在本課程中只有相同平均水平的學生。例如:如果我們有 4 名學生并且課程的平均值是 (60,70,80,80) 那么我只想得到最后 2 個學生的名字,因為他們的平均值相同。希望現在清楚了!
uj5u.com熱心網友回復:
您似乎在詢問學生,對于某些部分,他們的考試和學位季節 1 和 2 的平均值大于 1。
沒有樣本資料和預期的輸出來驗證,很難回答,但是,對于每個學生,你想要GROUP BY唯一標識學生的主鍵(否則你可能將兩個同名的學生聚合在一起),你只需要檢查如果該部分存在(而不是JOINing 該部分,因為如果有多個匹配的部分并扭曲平均值,則會創建重復的行)。
然后
如果我們有 4 個學生并且課程的平均值是 (60,70,80,80) 那么我只想得到最后 2 個學生的名字,因為他們的平均值相同
您想計算有多少學生具有相同的平均值,然后過濾掉那些具有獨特平均值的學生:
SELECT studentname,
average
FROM (
SELECT a.*,
COUNT(*) OVER (PARTITION BY average) AS num_with_average
FROM (
SELECT MAX(s.studentname) AS studentname,
( Avg(cs.exam_season_one)
Avg(cs.exam_season_two)
Avg(cs.degree_season_one)
Avg(cs.degree_season_two) ) / 4 AS average
FROM courses_student cs
join students s
ON s.student_id = cs.student_id
WHERE cs.courses_id = 1
AND s.studentname LIKE 'm%'
AND EXISTS(
SELECT 1
FROM section se
WHERE s.sectionid = se.sectionid
AND se.classes_id IN (2, 5)
)
GROUP BY
s.student_id
) a
)
WHERE num_with_average > 1;
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369928.html
下一篇:不能只更新1行。如何更改1行?
