我正在开发一个基于网络的培训管理系统,该系统将向管理层显示每个部门的培训记录。我的数据库设计如下:
员工表:用户名,姓名,职位,分部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)
此查询将显示每个部门根据月份进行的测验总数。我现在想要的是显示过去三个月的这些结果。此外,即使有一个不接受任何测验的师,我想展示所有的分歧。这意味着我想显示分数为零的测验。
答案 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(负向后退)添加间隔。