Sql server 表更新,按人员聚合

Sql server 表更新,按人员聚合,sql-server,tsql,Sql Server,Tsql,我有一个学生表,我想用每个学生的出勤信息更新一个字段 我天真的尝试失败了 UPDATE Student SET CurrentAttendance = COUNT(AttendanceID) FROM Student INNER JOIN Attendance ON Student.StudentID = Attendance.iStudentID 当然,您不能使用聚合进行更新 我找到了这个解决方案: UPDATE Student SET CurrentAttendance = q.COUNT

我有一个学生表,我想用每个学生的出勤信息更新一个字段

我天真的尝试失败了

UPDATE Student
SET CurrentAttendance = COUNT(AttendanceID)
FROM Student INNER JOIN Attendance ON Student.StudentID = Attendance.iStudentID
当然,您不能使用聚合进行更新

我找到了这个解决方案:

UPDATE Student
SET CurrentAttendance = q.COUNTID
FROM (SELECT COUNT(AttenanceID) AS COUNTID 
      FROM Student INNER JOIN Attendance 
      ON Student.StudentID = Attendance.StudentID) q
虽然这样运行没有错误,但显然是错误的。每个学生都有相同的出勤人数,这似乎是所有学生的出勤人数

如何运行此更新,使其仅更新每个学生的出勤人数?

获取派生表中按
StudentID
分组的
count()
,然后返回到
student

UPDATE S
SET CurrentAttendance = AttendanceCount
FROM Student S
INNER JOIN (SELECT COUNT(AttendanceID) as AttendanceCount, StudentID
            FROM Attendance
            GROUP BY StudentID) A on A.StudentID = S.StudentID

您需要一个
分组依据
和一个
位置

UPDATE Student
SET CurrentAttendance = q.COUNTID
FROM (SELECT COUNT(AttenanceID) AS COUNTID, StudentID
      FROM Attendance 
      Group by StudentID) q
WHERE StudentID = q.StudentID

你很接近。如果要更新所有学生,可以使用相关子查询:

UPDATE Student
SET CurrentAttendance = (SELECT COUNT(*)
                         FROM Attendance 
                         WHERE Student.StudentID = Attendance.iStudentID
                        );

这将更新所有学生,甚至那些在
出勤记录中没有记录的学生

这正是我所要找的!谢谢