Sql 如何显示上次发送/接受测验的参与者人数?
我正在开发一个简单的测验引擎,类似于ASP.NET网站中的测验引擎。我有以下数据库设计: 用户表:用户名、名称、部门代码。。。等 分区表:SapCode,分区 测验表:QuizID,标题,内容,描述 userquick:UserQuizID,QuizID,DateTimeComplete,Score,Username 每周,我公司的员工都会收到一封电子邮件通知,要求他们参加系统中提供的新测验。将发送给员工的测验将(True)作为Isent属性的值,这是区别于其他未发送给员工的测验的原因。我现在想要的是显示上一次测验的参与者人数,因为每周只发送一次测验 我的查询显示所有参加测验的参与者总数:Sql 如何显示上次发送/接受测验的参与者人数?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我正在开发一个简单的测验引擎,类似于ASP.NET网站中的测验引擎。我有以下数据库设计: 用户表:用户名、名称、部门代码。。。等 分区表:SapCode,分区 测验表:QuizID,标题,内容,描述 userquick:UserQuizID,QuizID,DateTimeComplete,Score,Username 每周,我公司的员工都会收到一封电子邮件通知,要求他们参加系统中提供的新测验。将发送给员工的测验将(True)作为Isent属性的值,这是区别于其他未发送给员工的测验的原因。我现在想
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
那么如何修正它以仅显示上次参加测验(发送的测验)的参与者人数?将所有
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
它应该只显示最后一个测试的结果并非所有发送给员工的测验都显示“最后一个”是什么?您没有表datetime字段:扫描我们通过QuizID和IsSent值确定它?仅当它是增量值时。你没有提到它是否是。这是一个增量,那么如何做呢?谢谢你的帮助,但我得到了以下错误,我不知道为什么:Msg 102,级别15,状态1,第5行“行号”附近的语法不正确。@AliAhmed:错过了
*
和行号()
,抱歉。