1

我是 SQL 新手,所以希望这有一个简单的答案。

我有一个学生表(studentID、name、statusID)和一个StudentClasses 表(studentID、classID)。我被要求从上面的表中创建一个返回以下列的视图:

类ID:(分组)

每个班级的学生人数 AS 学生

statusID = 1 As Actives 的学生人数

statusID = 2 As Inactives 的学生人数

我可以轻松地按 classID 列分组并计算学生人数,但我认为不能告诉 count 函数只计算某些行。一旦我添加 where 或 Have 子句,我就会丢失需要在其他列中计算的记录。我是否需要编写几个不同的查询,然后加入每个查询的结果?

感谢您的任何帮助,您可以提供!

-大卫

4

3 回答 3

7

这是 ANSI SQL(只要您的 SQL 实现与 ANSI 兼容,就应该可以工作):

SELECT 
 classID,
 COUNT(*) AS "Students",
 SUM(CASE statusID WHEN 1 THEN 1 ELSE 0 END) AS "Actives",
 SUM(CASE statusID WHEN 2 THEN 1 ELSE 0 END) AS "Inactives",
FROM StudentsClasses class
INNER JOIN Students stud ON class.studentID = stud.studentID
GROUP BY classID
于 2010-06-18T18:10:04.457 回答
1

与其数数,不如尝试对几个 IIF/CASE 语句求和?也就是说,使用 IIF,您的查询将是:

SELECT ClassId, COUNT(*) AS students,
       SUM(IIF(StatusId = 1, 1, 0)) as Actives,
       SUM(IIF(StatusId = 2, 1, 0)) as Inactives
FROM StudentsClasses
INNER JOIN Students ON StudentsClasses.StudentID = Students.StudentID
GROUP BY ClassId
于 2010-06-18T18:02:30.180 回答
0

像这样的语句将为每个班级提供一行,其中包含班级 ID 和其中的学生人数。

SELECT classID, COUNT(*) AS studentsInClass
    FROM students
    WHERE classID
    IN (SELECT DISTINCT classID FROM students)
    GROUP BY classID

WHERE x IN (...)事情是我刚刚学到的。

我不太确定另一部分。你想把这一切都放在一张桌子上吗?你可以UNION把它放进去,但它会很乱,因为数据不一样。

于 2010-06-18T18:18:47.647 回答