虽然多个匹配,但每个学生只计算一个记录

时间:2014-04-30 13:02:07

标签: sql azure-sql-database

我已设置SQL Fiddle来说明问题......

我有一个学生数据库(由PupilId引用),他们在不同时期(PeriodId)记录了各种科目(NCSubjectId)的评估(AssessmentLevelId)。

并非每个可能的时期都有评估。

PupilId | PeriodId | NCSubjectId | AssessmentLevelId
-----------------------------------------------------
100     | 1        | 10          | 1
100     | 3        | 10          | 2
200     | 1        | 10          | 1
300     | 1        | 10          | 1
400     | 1        | 10          | 1
100     | 5        | 10          | 2
300     | 7        | 10          | 2
100     | 15       | 10          | 2

我想找到特定PeriodId具有特定评估等级的学生人数。

到目前为止,我有这个:

SELECT PupilId, COUNT(1) FROM NCAssessment
WHERE AssessmentLevelId = 2
    AND NCSubjectId=10
    AND PeriodId <= 10
GROUP BY PupilId

找到瞳孔ID,但是瞳孔100的数量为2.我想我需要将其包装在另一个查询中,但是我很难过。有什么建议吗?

这是使用Azure SQL。

感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,我认为这可能就是你要找的东西:

AssessmentLevelId = 2已从查询中删除,因为某些期间可能没有评估。

SELECT AssessmentLevelID, PeriodID, COUNT(DISTINCT PupilID) 
FROM NCAssessment 
WHERE NCSubjectId=10 AND 
      PeriodId <= 10 
GROUP BY AssessmentLevelID, PeriodID

如果这不正确,请您发布您期望的样本结果。谢谢!

答案 1 :(得分:0)

如果您想要匹配的不同学生的数量,请使用count(distinct)

SELECT COUNT(DISTINCT PupilId) as NumMatchingPupils, COUNT(*) as NumMatchingAssessments
FROM NCAssessment
WHERE AssessmentLevelId = 2 AND NCSubjectId = 10 AND PeriodId <= 10;
无论地图数量多少,

COUNT(DISTINCT)都会对每个学生进行一次计算。 COUNT(*)COUNT(1)会计算匹配的评估数量。