SQL Server объединяет, группирует и т. Д. Для простого перебора чисел - PullRequest
1 голос
/ 07 августа 2010

Вот с чем я работаю (SQL Server):

  • факультетов : deptID, deptName
  • студентов : studID, studName, deptID
  • назначение : studID, courseID, статус

Студенты назначаются на кафедру, а в записи студента содержится идентификационный номер кафедры.«Задание» является связующим звеном между студентом и курсом (курс не показан), который имеет статус (неполный, пройденный, не выполненный).

Я хочу перечислить отделы и, с каждым отделом,общее количество студентов в этом отделении и общее количество заданий с каждым отдельным статусом (см. пример ниже, если эта формулировка сбивает с толку.)

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

Пример: на одном факультете 5 студентов и 5 курсов.Каждому студенту назначается каждый из этих 5 курсов.Только один студент закончил все курсы, остальные ничего не сделали.Таким образом, итоговые данные для этого отдела будут 20, а не попыток, 5 пройденных, 0 неполных.

Я буду рад ответу, который предлагает SQL на очень абстрактном уровне ... Мне просто нужно знатьесли объединения должны быть вложенными или тем не менее это сработает.

Ответы [ 3 ]

2 голосов
/ 07 августа 2010

Что-то вроде

SELECT departments.deptName,
       sum(case when status = 'attempted' then 1 else 0 end) as attempted_count,
       sum(case when status = 'passed' then 1 else 0 end) as passed_count,
       sum(case when status = 'incomplete' then 1 else 0 end) as complete_count

FROM departments JOIN students JOIN Assignment
GROUP BY departments.deptName

Поскольку вы просто хотели получить идею, я не указывал условия СОЕДИНЕНИЯ.

0 голосов
/ 07 августа 2010

А как насчет этого?

SELECT 
  D.deptName, A.status, 
  COUNT(*) AS statusCount, 
  COUNT(DISTINCT(S.studID)) AS studCount
    FROM departments AS D
    INNER JOIN students AS S ON D.deptID = S.deptID
    INNER JOIN assignments AS A ON S.studID = A.studID
    GROUP BY D.deptName, A.status
0 голосов
/ 07 августа 2010

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

SELECT d.deptname, a.status, COUNT(a.status)
FROM departments d
JOIN students s ON d.deptid = s.deptid
JOIN assignment a ON s.studid = a.studid
GROUP BY d.deptname, a.status

Чтобы добавить количество студентов на кафедру, я бы, вероятно, просто сделал еще один запрос.Было бы трудно сделать это в том же запросе, что и при группировании по статусу назначения.

...