2016-10-04 76 views
1

我有一个表格,其中包含StudentID,ClassID,ExamID,SubjectID和分数 我试图从每个学生的尝试科目中获得7个顶级分数的总和。下面的SQL语句是给我的所有科目的分数之和从顶部7名学生:选择TOP谓词

SELECT TOP 7 Sum(tblScores.Scores) AS Total, tblScores.AdmissionID 
FROM tblScores 
WHERE (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
GROUP BY tblScores.AdmissionID 
ORDER BY Sum(tblScores.Scores) DESC; 

的阶级和考试标准,从构成读“frmReports”

任何一个谁可以帮助我出去了?

+0

请提供采样数据和期望的结果。是什么让7名学生成为最好的?如果分数是捆绑的呢? –

+0

我对7个最好的学生不感兴趣。上面的sql可以解决这个问题。我对来自7个科目的最佳分数感兴趣(在10个或12个尝试中) - 这将是我期望的结果。我的桌子有5个字段(我们关心的)。这些是AdmissionID,ClassID,ExamID,SubjectID和分数 – Wakwehu

回答

0

@芭菲 - 谢谢您的指导。其实我已经调整了您的解决方案,以获得一个完美的答案:这是sql:

SELECT Dupe.AdmissionID,Dupe.Scores,Dupe.ScoreRank FROM(SELECT qryFilteredScores.AdmissionID,qryFilteredScores.Scores,(SELECT COUNT(* )FROM qryFilteredScores AS sub
WHERE sub.AdmissionID = qryFilteredScores.AdmissionID AND sub.Scores> qryFilteredScores.Scores)+ 1 AS ScoreRank FROM qryFilteredScores WHERE((((qryFilteredScores.ExamID)= Forms!frmReports!lstC)和((qryFilteredScores。 (((Dupe.Scores)<> 0)AND((Dupe.ScoreRank)< = 7));((Dupe.ScoreRank)<)

或者,也可以使用派生表或存储查询(其中保存派生表如该查询中引用的单独的对象),并避免内嵌子查询:

SELECT Dupe.AdmissionID, Total.TotalScore 
FROM qryFilteredScores AS Dupe 
INNER JOIN 
    (SELECT sub.AdmissionID, Sum(sub.Scores) As TotalScore 
     FROM qryFilteredScores sub 
     WHERE ([AdmissionID]=Dupe.[AdmissionID] 
     AND ((sub.ClassID)=[Forms]![frmReports]![lstB]) 
     AND ((tblScores.ExamID)=[Forms]![frmReports]![lstC])) 
     GROUP BY sub.AdmissionID) AS Total 
ON Dupe.AdmissionID = Total.AdmissionID 
GROUP BY Dupe.AdmissionID, Total.TotalScore 
ORDER BY Dupe.AdmissionID; 
+0

但是,你在哪里拿到每个学生最高的7分?你可能想要显示'qryFilteredScores'。将子查询移动到“JOIN”会更有效,因为您不再与外部查询相关,而只是匹配ID。 – Parfait

+0

根据7个最佳科目分数计算GPA所需的前7个分数。我想避免报告中的函数调用,这就是为什么我想要纯SQL解决方案(因此主查询中的子查询),因为报告认为我会获得更好的性能。我错了。该报告需要3分钟以上才能生成。再次感谢你。 – Wakwehu

+0

你没有回答我的问题。在你接受的解决方案中,你是否筛选了学生的前7名成绩?现在已清楚地显示,并且指定查询的内容未知。这篇文章的未来读者将难以理解。为什么提到函数调用?我们在这里所做的只是SQL。当你运行一个子查询可能是一个连接表时,这个查询会花费一些时间,避免为每一行表单单独选择。请参阅编辑的选项 – Parfait

0

试试这个:

SELECT TOP 7 Sum(tblScores.Scores) AS Total, tblScores.AdmissionID 
FROM tblScores 
HAVING (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
GROUP BY tblScores.AdmissionID 
ORDER BY Sum(tblScores.Scores) DESC; 
+0

@劳伦斯这是我第一次尝试。我会得到第一批最好的学生的总成绩。我想要的是所有学生的7个最佳分数的总和。 – Wakwehu

+0

事实上,将条件从WHERE运动到HAVING条款应该没有什么区别。 – Parfait

1

考虑相关子查询来计算分数的运行级别。然后,窝在派生表这个选择查询分数聚集,每个学生的最高得分7名(含并列)过滤:

SELECT main.AdmissionID, Sum(main.Scores) As [Total] 
FROM 
    (SELECT tblScores.AdmissionID, tblScores.Scores, 
     (SELECT Count(*) FROM tblScores sub 
      WHERE sub.AdmissionID = tblScores.AdmissionID 
      AND sub.Scores >= tblScores.Scores) As ScoreRank 
    FROM tblScores 
    WHERE (((tblScores.ExamID)=[Forms]![frmReports]![lstC]) 
    AND ((tblScores.ClassID)=[Forms]![frmReports]![lstB])) 
) As main 
WHERE main.ScoreRank <= 7 
GROUP BY main.AdmissionID 
+0

@ parfait - 这个概念听起来不错。但是我的例子有问题。过滤的部分是我迷路的地方。你能解释一下 – Wakwehu

+0

但它工作吗?运行包装在* main *别名中的嵌套'SELECT'查询,您会看到* ScoreRank *列的学生成绩从最高到最低。 – Parfait

+0

然后我们运行另一个聚合查询,使用这个嵌套的查询作为源代码* ScoreRank * 7或更少,这意味着每个学生的前7 *分数*。实际上,在MS Access中,您不需要嵌套子查询,但可以将其保存为单独的查询以在最后一个中引用。 – Parfait