Easy SQL Group-问题。 (我是新来的)

时间:2010-06-18 17:58:51

标签: sql group-by aggregate-functions

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

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

classID :(分组)

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

statusID = 1 As Actives

的学生数量

statusID = 2的学生数量为非活动人数

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

感谢您提供的任何帮助!

-David

3 个答案:

答案 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它,但由于数据不一样,它会很混乱。