2010-06-18 2 views
1

Я новичок в SQL, поэтому, надеюсь, у этого есть простой ответ.Easy SQL Group-По вопросу. (Я новичок)

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

Classid: (группы по)

Количество студентов в каждом классе, как студенты

Граф студенты, где StatusId = 1 в Actives

Количество студентов, где StatusId = 2 Как Inactives

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

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

-Давид

+1

Это SQL или Mysql? И какой язык вы используете? Пример: PHP – Zuul

+0

@ Zuul - MSSQL 2005 (новый вид), страница ASP.NET будет использовать представление. – David

ответ

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 
+0

Ничего особенного TSQL - это все ANSI –

+0

Прохладный thx для уточнения, я только использовал T-SQL, поэтому просто хотел покрыть эту базу в случае, когда я использовал что-то нестандартное. (Я отредактировал ответ, чтобы уточнить) – David

+0

+1 для ответа ANSI. – Donnie

1

Вместо того, чтобы подсчитывать, почему бы вам не попробовать суммированием пару заявлений IIF/ДЕЛО? То есть, используя 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

@ Виллиам Тодд Зальцман - Еще не все, что можно сказать иначе: «Ничего себе, извините, я ответил, что у ОР возникли проблемы, но не случилось, чтобы выполнить весь запрос. Я почти уверен, что OP знает, как вместе со своими столами, он спрашивал конкретно о том, как получить счет «Actives» и «Inactives». О, и я тоже немного удивлен, что вы не ответили ниже на @Brendan Long, в котором используется таблица ' студентов, где он должен использовать «студенческие классы», но что угодно ». –

0

заявление, как это даст вам строка для каждого класса с идентификатором класса и количеством студентов в нем.

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

WHERE x IN (...) вещь, что я только что узнал.

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

Смежные вопросы