我是SQL的新手,所以希望这有一个简单的答案。
我有一个学生表(studentID,name,statusID)和StudentsClasses表(studentID,classID)。我被要求从上面的表中创建一个返回以下列的视图:
classID :(分组)
每个班级的学生数量AS学生
statusID = 1 As Actives
的学生数量statusID = 2的学生数量为非活动人数
我可以轻松地按classID colunm进行分组并计算学生数量,但我不认为count函数可以被告知只计算某些行。一旦我添加where或having子句,我就会丢失记录,我需要在其他列中计算。我是否需要编写几个不同的查询,然后加入每个查询的结果?
感谢您提供的任何帮助!
-David
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
这样的声明将为每个班级提供一行,其中包含班级ID和学生人数。
SELECT classID, COUNT(*) AS studentsInClass
FROM students
WHERE classID
IN (SELECT DISTINCT classID FROM students)
GROUP BY classID
WHERE x IN (...)
这件事我刚才学到了。
我不确定另一部分。你想把这一切都放在一张桌子里吗?你可以UNION
它,但由于数据不一样,它会很混乱。