Простой SQL Group-By вопрос.(Я новый) - PullRequest
1 голос
/ 18 июня 2010

Я новичок в SQL, так что, надеюсь, у этого есть простой ответ.

У меня есть таблица учеников (studentID, name, statusID) и таблица StudentsClasses (studentID, classID). Меня попросили создать представление из приведенных выше таблиц, которое возвращает следующие столбцы:

classID: (по группам)

количество студентов в каждом классе AS студентов

количество студентов, где statusID = 1 как актив

количество студентов, где statusID = 2 как неактивные

Я могу легко сгруппировать по столбцу classID и посчитать количество студентов, но я не думаю, что функции count можно сказать, чтобы она считала только определенные строки. Как только я добавляю, где или имея предложения, я теряю записи, которые мне нужно посчитать в других столбцах. Нужно ли мне написать пару разных запросов, а затем объединить результаты каждого?

Спасибо за любую помощь, которую вы можете оказать!

-Давид

Ответы [ 3 ]

7 голосов
/ 18 июня 2010

Это 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 голос
/ 18 июня 2010

Вместо того, чтобы считать, почему бы вам не попытаться суммировать пару утверждений 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
0 голосов
/ 18 июня 2010

Такое утверждение даст вам строку для каждого класса с идентификатором класса и количеством учащихся в нем.

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

WHERE x IN (...) - это то, что я только что узнал.

Я не совсем уверен насчет другой части. Вы хотите все это в одном столе? Вы можете UNION это ввести, но это будет грязно, поскольку данные не совпадают.

...