感谢您对SQL问题的帮助。
我在SQL表中有一些学生测验得分数据,我希望编写一个查询来提取我想要的信息。考生可以根据自己的意愿多次尝试考试。理想情况下,对于每个候选人,我希望在每个测试中找出他们的最高百分比分数。我希望每次测试得到他们最高百分比的平均百分比。许多候选人不会完成所有测试。例如,考生1,2和3中考生1的最高分数分别为50%,100%和0%,总体平均分为50%。
该表名为resultsets。相关的列标题名称是:候选者(这是学生ID号),QuizName(每个测验的标题)和PercentageScore。它看起来像这样:
Candidate | QuizName | PercentageScore
---------------------------------------
1 | Test1 | 25
1 | Test1 | 50
1 | Test2 | 100
1 | Test3 | 0
2 | Test1 | 50
2 | Test1 | 100
3 | Test3 | 75
我希望得到一张看起来像这样的表:
Candidate | Test1 | Test 2 | Test 3 | AveragePercentageScore
---------------------------------------
1 | 50 | 100 | 0 | 50
2 | 50 | 100 | 0 | 50
3 | 0 | 0 | 75 | 25
(谢谢Jain)我想知道我应该输入的SQL命令。
谢谢!
答案 0 :(得分:0)
除了作为初学者之外,最好还是掌握基本的表/数据库结构,关系,主键/外键的使用,尤其是数据规范化。
至于学习查询,我看到其他人使用SQL Zoo,因为它有样本数据,并涵盖了如何寻找需要不同查询,连接,左连接,聚合等的某些事物的样本。
所有这一切,如果您能够根据您的数据理解查询,而不是某些通用示例数据库,您的数据应用程序没有上下文,有时它会使事情变得更容易。
尽管如此,我会帮助你开始。您需要基于" GROUP BY"的聚合(最小值,最大值,平均值,计数值)。列)。在第一种情况下,您希望为每个候选人找到"" (分组),以及每个" QUIZ"对于那个CANDIDATE(也是group by的一部分),你想要最高的测试。
SELECT
Q.candidate,
Q.quizname,
MAX( Q.PercentageScore ) as HighestScore
from
YourQuizTable Q
group by
Q.candidate,
Q.quizname
将导致以下结果。
Candidate QuizName HighestScore
1 Test1 50
1 Test2 100
1 Test3 0 (a legit score on file)
2 Test1 100
3 Test3 75
由此,您可以创建一个支点。现在,不同的sql引擎有不同的pivot语法,但为了更好地看到这些特定的quizes发布,我将做一个硬编码的支点。由于导出了数据透视(使用第一个查询作为基础),因此第一个查询是数据透视的基础。
SELECT
smry.Candidate,
if( smry.quizname = 'Test1', smry.HighestScore, 0 ) as HiTest1,
if( smry.quizname = 'Test2', smry.HighestScore, 0 ) as HiTest2,
if( smry.quizname = 'Test3', smry.HighestScore, 0 ) as HiTest3,
AVG( smry.HighestScore ) as AvgTest
from
( SELECT
Q.candidate,
Q.quizname,
MAX( Q.PercentageScore ) as HighestScore
from
YourQuizTable Q
group by
Q.candidate,
Q.quizname ) smry
group by
smry.Candidate
" IF()"在尝试每一行时应用,每行只有1个quizname的实例,它只能是" Test1"," Test2"或" Test3"。如果是正确的测试,则获取最高分作为该列结果中显示的基础。最后一列是一个简单的平均值。
最后一个小组现在正在为每个候选人保留它们,但这次没有内部查询所具有的测验组。