Я разрабатываю простой движок викторины, похожий на тот, что на веб-сайте 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)
И желаемый результат должен быть таким:
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