我已设置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。
感谢。
答案 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)
会计算匹配的评估数量。