SQL数据查询请求

时间:2015-11-20 08:55:57

标签: mysql

感谢您对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命令。

谢谢!

1 个答案:

答案 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"。如果是正确的测试,则获取最高分作为该列结果中显示的基础。最后一列是一个简单的平均值。

最后一个小组现在正在为每个候选人保留它们,但这次没有内部查询所具有的测验组。