如何从另一个表中获取名称列表+与名称相关的事件计数

Jac*_*ing 6 sql t-sql

希望我的主题足够描述.

基本上,我有一个名为Students的表,还有一个名为Absences的表.学生表包含学生信息(姓名,DOB,学生ID等),缺勤表包含任何缺勤(日期,原因,由StudentID相关).我想得到一份完整的学生名单,以及他们缺席的情况.

样本结果如下:

StudentName    Absences
-------------  -----------
Johnny         3
Mark           2
James          1
Anthony        0
Sharon         0

有人可以建议我应该解决这个问题吗?

我宁愿有一个SQL语句,可能包含一些视图等.

谢谢,

雅各布.

mdm*_*dma 14

这将查找每个学生的缺席次数,并按照您的示例中的大多数缺勤排序.

SELECT 
   studentname, count(absences_id)
FROM
   Students s 
LEFT OUTER JOIN 
   Absences a ON s.student_id=a.student_id
GROUP BY studentname
ORDER BY count(absences_id) DESC, student_name
Run Code Online (Sandbox Code Playgroud)

LEFT OUTER JOIN非常重要,因为缺席表中某些学生可能没有行.在这种情况下,来自该行的缺勤的所有字段都将为空,并且计数将为零,因为它仅计算非空字段.

如果每次缺席都可以跨越一系列日期,例如由于病假或延长假期而缺勤,那么您可以将start_date,end_date添加到Absences表并用SUM替换COUNT(absences_id)(DATEDIFF(day,start_date,end_date)),例如

SELECT 
   studentname, SUM(ISNULL(DATEDIFF(day, start_date, end_date),0)
FROM
   Students s 
LEFT OUTER JOIN 
   Absences a ON s.student_id=a.student_id
GROUP BY studentname
Run Code Online (Sandbox Code Playgroud)

您可以将ORDER BY子句设置为SUM(...),但它将提高可读性和可维护性,以将其包装在另一个查询中.