Как посмотреть общее количество участников, которые получили 100 в викторине? - PullRequest
0 голосов
/ 26 февраля 2012

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

  • Пользователь: Username, Name, DivisionCode ... и т. Д.

  • Разделение: SapCode, Division.

  • Тест: QuizID, Title, IsSent, Description.

  • UserQuiz: UserQuizID, QuizID, DateTimeComplete, Score, Username

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

    My Query which is not correct is:

    SELECT     dbo.Divisions.DivisionShortcut, COUNT(dbo.UserQuiz.Username) AS [Number of Participants]
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.UserQuiz.QuizID = @QuizID)
GROUP BY dbo.Divisions.DivisionShortcut, dbo.UserQuiz.Score
HAVING      (dbo.UserQuiz.Score = 100)

И желаемый результат должен быть таким: enter image description here

EDIT: Сейчас я не могу определить QuizID:

;with OrderedAttempts as (
     select Username,Score,QuizID,
       ROW_NUMBER() OVER (PARTITION BY Username,QuizID ORDER BY DateTimeComplete) as rn
     from UserQuiz
     WHERE     (dbo.UserQuiz.QuizID = @QuizID)
), FirstAttempts as (
     select Username,Score,QuizID from OrderedAttempts where rn = 1
)
select
    d.DivisionName,
    COUNT(fa.Score)
from 
    Divisions d
        left join
    Employee e
        left join
    FirstAttempts fa
        on
            e.Username = fa.Username
        on
            d.SapCode = e.DivisionCode
group by
    d.DivisionName

1 Ответ

2 голосов
/ 26 февраля 2012

Самая простая часть запроса - найти всех, кто набрал 100 баллов с первой попытки:

;with OrderedAttempts as (
     select UserName,Score,QuizID,
       ROW_NUMBER() OVER (PARTITION BY UserName,QuizID ORDER BY DateTimeCompleted) as rn
     from UserQuiz
), FirstAttempts as (
     select UserName,Score,QuizID from OrderedAttempts where rn = 1
)
select
    d.DivisionName,
    COUNT(fa.Score)
from
    Division d
        left join
    User u
        left join
    FirstAttempts fa
        on
            u.UserName = fa.UserName
        on
            d.SapCode = u.DivisionCode
group by
    d.DivisionName

Надеемся, что оттуда вы сможете создать оставшуюся часть запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...