1

、、およびStudentScoreのフィールドを持つという名前のテーブルが 1 つあります。後の 3 つが主キーです。ScoreCourseIDStudentIDSemester

各生徒の平均点を取得するストアド プロシージャを作成したいと考えています。しかし、ルールは非常に複雑で、1 つのクエリで表現する方法がわかりません。可能であれば、ネストされたクエリは避ける必要があります。

ルールは次のとおりです。

1 人の学生が 2 回以上コースを受講した場合、最後のスコアのみを計算する必要があります。

たとえば、次のデータがあります。

StudentID    | CourseID  | Semester  | Score
1              1           1           80
1              2           1           40
1              3           1           60
1              2           2           50
1              3           2           20
2              1           1           90

ストアド プロシージャは次を返す必要があります。

StudentID    | AvgScore
1              50 // which is avg(80, 50, 20)
2              90

できるだけ効率的なストアド プロシージャを提案してください。ありがとう!

4

1 に答える 1

2
;WITH x AS 
(
  SELECT StudentID, Score, rn = ROW_NUMBER() OVER 
   (PARTITION BY StudentID, CourseID 
    ORDER BY Semester DESC) 
  FROM dbo.StudentScore
)
SELECT StudentID, AvgScore = AVG(Score)
FROM x
WHERE rn = 1
GROUP BY StudentID;

小数点以下第2位を四捨五入したい場合は、次のようにします。

;WITH x AS 
(
  SELECT StudentID, Score = 1.0*Score, rn = ROW_NUMBER() OVER 
   (PARTITION BY StudentID, CourseID 
    ORDER BY Semester DESC) 
  FROM dbo.StudentScore
)
SELECT StudentID, AvgScore = CONVERT(DECIMAL(10,2), AVG(Score))
FROM x
WHERE rn = 1
GROUP BY StudentID;
于 2012-08-07T03:43:05.133 に答える