Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何显示上次发送/接受测验的参与者人数?_Sql_Sql Server 2008 R2 - Fatal编程技术网

Sql 如何显示上次发送/接受测验的参与者人数?

Sql 如何显示上次发送/接受测验的参与者人数?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我正在开发一个简单的测验引擎,类似于ASP.NET网站中的测验引擎。我有以下数据库设计: 用户表:用户名、名称、部门代码。。。等 分区表:SapCode,分区 测验表:QuizID,标题,内容,描述 userquick:UserQuizID,QuizID,DateTimeComplete,Score,Username 每周,我公司的员工都会收到一封电子邮件通知,要求他们参加系统中提供的新测验。将发送给员工的测验将(True)作为Isent属性的值,这是区别于其他未发送给员工的测验的原因。我现在想

我正在开发一个简单的测验引擎,类似于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:错过了
*
行号()
,抱歉。