SQL Server连接,组等进行简单的数字运算

时间:2010-08-06 20:36:12

标签: sql-server join count group-by

以下是我正在使用的内容(SQL Server):

  • 部门:deptID,deptName
  • 学生:studID,studName,deptID
  • 作业:studID,courseID,status

学生被分配到一个部门,学生记录中包含部门的ID号。 “作业”是学生和课程(课程未显示)之间的链接,其中包含状态(不完整,通过,未尝试)。

我想列出各个部门,并列出每个部门,该部门的学生总数以及每个个人状态的总分配数(如果这个措辞令人困惑,请参阅下面的示例。)

理想情况下,每个部门都会返回一行。当运行这样的查询时,这通常是我遇到的问题。

示例:一个部门有5名学生和5门课程。每个学生恰好分配到这5门课程中的每一门课程。只有一名学生完成了所有课程,其他学生则没有做任何事。因此,该部门的总数将不会尝试20次,5次传递,0次不完整。

我会很高兴得到一个非常抽象的SQL建议的答案......我只需要知道连接是否需要嵌套,或者这是否可行。

3 个答案:

答案 0 :(得分:2)

这样的东西
SELECT departments.deptName,
       sum(case when status = 'attempted' then 1 else 0 end) as attempted_count,
       sum(case when status = 'passed' then 1 else 0 end) as passed_count,
       sum(case when status = 'incomplete' then 1 else 0 end) as complete_count

FROM departments JOIN students JOIN Assignment
GROUP BY departments.deptName

正如你想要的那样,我没有说明JOIN条件。

答案 1 :(得分:0)

除了每个部门的学生数量外,这将为您提供所需。

SELECT d.deptname, a.status, COUNT(a.status)
FROM departments d
JOIN students s ON d.deptid = s.deptid
JOIN assignment a ON s.studid = a.studid
GROUP BY d.deptname, a.status

要按部门计数添加学生,我可能只是做另一个查询。在您按分配状态进行分组的同一查询中进行此操作很困难。

答案 2 :(得分:0)

这样的事情怎么样?

SELECT 
  D.deptName, A.status, 
  COUNT(*) AS statusCount, 
  COUNT(DISTINCT(S.studID)) AS studCount
    FROM departments AS D
    INNER JOIN students AS S ON D.deptID = S.deptID
    INNER JOIN assignments AS A ON S.studID = A.studID
    GROUP BY D.deptName, A.status