Sql 如何显示过去三个月的结果?

Sql 如何显示过去三个月的结果?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我正在开发一个基于网络的培训管理系统,该系统将向管理层显示每个部门的培训记录。我的数据库设计如下: 员工表:用户名、姓名、职务、部门ID 部门表:部门ID、部门名称 测验表:QuizID,标题,描述 userquick表:UserQuizID,Score,DateTimeComplete,QuizID,Username 注意:每个表中的第一个属性是主键 我用于此任务的SQL查询是: SELECT COUNT(DISTINCT dbo.UserQuiz.QuizID) AS [Total Numb

我正在开发一个基于网络的培训管理系统,该系统将向管理层显示每个部门的培训记录。我的数据库设计如下:

员工表:用户名、姓名、职务、部门ID

部门表:部门ID、部门名称

测验表:QuizID,标题,描述

userquick表:UserQuizID,Score,DateTimeComplete,QuizID,Username

注意:每个表中的第一个属性是主键

我用于此任务的SQL查询是:

SELECT COUNT(DISTINCT dbo.UserQuiz.QuizID) AS [Total Number of Quizzes], 
  dbo.Divisions.DivisionName, 
  DATENAME(Month, dbo.UserQuiz.DateTimeComplete) AS Month 
FROM dbo.UserQuiz 
INNER JOIN dbo.Quiz 
  ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID 
INNER JOIN  dbo.employee 
  ON dbo.UserQuiz.Username = dbo.employee.Username 
RIGHT OUTER JOIN dbo.Divisions 
  ON dbo.employee.DivisionCode = dbo.Divisions.SapCode 
GROUP BY dbo.Divisions.DivisionName,
  DATENAME(Month, dbo.UserQuiz.DateTimeComplete)

此查询将显示每个部门每月参加的测验总数。我现在想要的是展示过去三个月的结果。此外,我想显示所有的分区,即使有一个分区不进行任何测验。这意味着我想用零次测验来显示分数。

要显示所有分数,需要先显示在列表中,然后与计数结果合并。您需要合并()该值,因此如果为null,将返回零。对于最后3个月,您只需要为日期范围添加WHERE子句

编辑。。。根据评论。我把它向前推进了一步,对于每个部门,我创建了一个交叉表来显示部门,其中3列在一行中显示每个月的计数。。。因此,结果列名称将是相同的,但将反映实际的月份数据内容。。。实际上只在2个月前调整了WHERE条款。。。2个月后加上电流等于3个月

 select 
          d.DivisionName,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, DateAdd( month, -2, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as TwoMonthsAgoCount,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, DateAdd( month, -1, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as OneMonthAgoCount,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as CurrentMonthCount
       from
          Divisions d
             left join
             ( select count( distinct UQ.QuizID ) DistinctQuizes,
                     DATENAME(Month, UQ.DateTimeComplete) ByMonth,
                      d2.DivisionName
                  from 
                     UserQuiz UQ
                        JOIN Quiz Q on UQ.QuizID = Q.QuizID
                        JOIN Employee E on UQ.UserName = E.UserName
                           JOIN Divisions D2 on E.DivisionCode = D2.SapCode
                  where
                    UQ.DateTimeComplete between 
                        DateAdd( month, -2, GetDate())  and GetDate() 
                  group by 
                     d2.DivisionName,
                     DATENAME(Month, UQ.DateTimeComplete)
             ) PreQuery
             ON d.DivisionName = PreQuery.DivisionName
   GROUP BY
      d.DivisionName

通过使用“GetDate()”,它将返回计算机上的当前日期。这将是结束日期。第一个日期是基本的日期算术。。。使用DateAdd函数,根据当前日期添加一个基于-2个月的间隔(负返回)。

感谢您的帮助,但我在尝试执行此查询时出错。错误是:Msg 4145,级别15,状态1,第22行在“,”附近预期条件的上下文中指定的非布尔类型表达式。@MohammedAl Ali,我的oops。。。最后一个应该是“ON”子句的一个=。今天早上我和家人出去的时候错过了。我还添加了COALESCE(),因为我无法在WHERE子句中确定日期。仅供参考,我将使用query在ASP.NET中生成图表。此图表应该是动态的,这意味着它应该自动显示基于过去三个月的不同结果。例如,如果我明天去看这个图表,它会显示从明天开始的最后三个月的结果。那么如何做到这一点呢?@MohammedAl Ali,请参阅使用GetDate()和DateAdd()修改后的答案非常感谢,但有一点我在这个查询中没有得到。查询应显示三个月中每个月的所有部门的结果。例如,如果我有六个部分,那么查询应该在12月、11月、10月向我显示这些部分,以及所参加的测验的总数,可能是0,也可能是任意数量