Как показать количество участников в последней отправленной / принятой викторине? - PullRequest
0 голосов
/ 27 февраля 2012

Я разрабатываю простой движок викторины, похожий на тот, что на веб-сайте ASP.NET. У меня есть следующий дизайн базы данных:

Таблица пользователей: имя пользователя, имя, код подразделения ... и т. Д.

Таблица деления: SapCode, Деление

Таблица теста: QuizID, Title, IsSent, Description

UserQuiz: UserQuizID, QuizID, DateTimeComplete, счет, имя пользователя

Каждую неделю сотрудники моей компании будут получать по электронной почте уведомление об участии в новой викторине, доступной в системе. Тест, который будет отправлен сотрудникам, будет иметь (True) в качестве значения атрибута IsSent, и именно это отличает его от других тестов, которые не отправляются сотрудникам. Теперь я хочу показать количество участников в последнем пройденном тесте, поскольку каждую неделю будет отправляться только один тест.

Мой запрос, который показывает общее количество участников во всех проведенных тестах:

SELECT     dbo.Divisions.DivisionShortcut, COUNT(DISTINCT dbo.UserQuiz.Username) AS [Number of Participants], dbo.Quiz.QuizID
FROM         dbo.Divisions INNER JOIN
                      dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode INNER JOIN
                      dbo.UserQuiz ON dbo.employee.Username = dbo.UserQuiz.Username INNER JOIN
                      dbo.Quiz ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID
WHERE     (dbo.Quiz.IsSent = 1)
GROUP BY dbo.Divisions.DivisionShortcut, dbo.Quiz.QuizID

Так как исправить это, чтобы показывать только количество участников в последнем пройденном тесте (отправленный тест)?

1 Ответ

1 голос
/ 27 февраля 2012

Оцените все IsSent = 1 викторины в порядке убывания QuizID, затем выберите второе место:

;
WITH SentQuizRanked AS (
  SELECT
    *,
    ROW_NUMBER() OVER (ORDER BY QuizID DESC) AS rnk
  FROM dbo.Quiz
  WHERE IsSent = 1
)
SELECT
  d.DivisionShortcut,
  COUNT(DISTINCT uq.Username) AS [Number of Participants],
  q.QuizID
FROM dbo.Divisions d
  INNER JOIN dbo.Employee  e ON d.SapCode  = e.DivisionCode
  INNER JOIN dbo.UserQuiz uq ON e.Username = uq.Username
  INNER JOIN dbo.Quiz      q ON uq.QuizID  = q.QuizID
WHERE q.rnk = 2  /* the #1 quiz is the one being advertised,
                    so #2 is the last one taken */
GROUP BY
  d.DivisionShortcut,
  q.QuizID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...