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

时间:2011-12-11 08:33:52

标签: sql sql-server-2008-r2

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

  

员工表:用户名,姓名,职位,分部ID

     

分区表:DivisionID,DivisionName

     

测验表:QuizID,标题,描述

     

UserQuiz表: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)

此查询将显示每个部门根据月份进行的测验总数。我现在想要的是显示过去三个月的这些结果。此外,即使有一个不接受任何测验的师,我想展示所有的分歧。这意味着我想显示分数为零的测验。

1 个答案:

答案 0 :(得分:1)

要显示所有分区,需要在列表中排在第一位,然后LEFT JOIN到计数结果。你需要COALESCE()值,所以如果为null,将返回零。至于最近3个月,您只需要为日期范围添加WHERE子句。

编辑...每条评论。我已经更进了一步,对于每个部门,我已经将它创建为一个交叉表,以显示分区,其中3列显示每行中每个月的计数......所以,生成的列名称会是相同的,但会反映实际的月份数据内容......实际上调整了WHERE条款只有2个月...... 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()”,这将返回计算机上当前日期的内容。这将是ENDING日期​​。第一个日期是基本日期算术...使用DateAdd函数,根据当前日期的任何内容,根据月份-2(负向后退)添加间隔。