Sql 如何从另一个表中获取名称列表+与名称相关的出现次数

Sql 如何从另一个表中获取名称列表+与名称相关的出现次数,sql,tsql,Sql,Tsql,希望我的主题行足够有描述性 基本上,我有一张桌子叫学生,还有一张桌子叫缺席。Students表包含学生信息名称、DOB、StudentID等,缺勤表包含与StudentID相关的任何缺勤日期、原因。我想要一份完整的学生名单,加上他们缺课的次数 样本结果如下: StudentName Absences ------------- ----------- Johnny 3 Mark 2 James 1 Anthony 0 S

希望我的主题行足够有描述性

基本上,我有一张桌子叫学生,还有一张桌子叫缺席。Students表包含学生信息名称、DOB、StudentID等,缺勤表包含与StudentID相关的任何缺勤日期、原因。我想要一份完整的学生名单,加上他们缺课的次数

样本结果如下:

StudentName Absences ------------- ----------- Johnny 3 Mark 2 James 1 Anthony 0 Sharon 0 有人能建议我解决这个问题的方法吗

我更喜欢一条SQL语句,可能包含一些视图等

谢谢


Jacob.

这将找到每个学生的缺课次数,并首先按大部分缺课进行排序,如您的示例所示

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
左外联接很重要,因为对于某些学生,缺勤表中可能没有行。在这种情况下,该行缺勤的所有字段都将为null,并且计数将为零,因为它只统计非null字段

如果每次缺勤可以跨越一系列日期,例如因病假或延长假期缺勤,则您可以将开始日期、结束日期添加到缺勤表中,并用SUMDATEDIFFday、开始日期、结束日期替换Count缺勤id,例如

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

您可以将ORDER BY子句设置为SUM。。。但将其封装在另一个查询中将提高可读性和可维护性。

选择s.StudentName作为StudentName,counta.*作为学生的缺席
s.StudentID=a.StudentID上的内部联接缺少a

您应该使用左联接,否则将不显示缺少0的学员。+是Oracle左联接语法-使用ANSI-92左联接语法,因为TSQL表示SQL Server或Sybase…谢谢。。。在根据Randy的答案工作之后,我自己终于提出了这个问题。谢谢你的帮助和解释。我从来没有真正使用过GROUPBY子句。。。我想我得在SQLBOL上查一下。再次感谢。
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