2015-11-20 3 views
0

Буду признателен за вашу помощь с проблемой SQL.Запрос данных SQL-запроса

У меня есть данные оценки студенческой викторины в таблице SQL, и я хочу написать запрос для извлечения информации, которую я хочу. Кандидаты могут проводить тесты столько раз, сколько они пожелают. В идеале для каждого кандидата я хочу узнать их самый высокий процентный балл по каждому из тестов. И я хочу получить средний процент от их наивысшего процентного балла по каждому тесту. Многие кандидаты не проведут все тесты. Например, самые высокие баллы кандидата 1 на тестах 1, 2 и 3 составляют 50%, 100% и 0%, что составляет в среднем 50%.

Таблица называется наборами результатов. Соответствующие названия названий столбцов: Кандидат (это идентификационный номер студента), 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

Что вы хотите знать? – Jain

+2

Вы объяснили, что хотите - теперь вам нужно показать, что вы пробовали до сих пор, и сказать, почему он не получает желаемые результаты.Отображение данных ваших таблиц и примеров поможет нам вам помочь. – PaulF

+0

Спасибо за комментарий PaulF. Я настоящий начинающий, и я просто шатался. Я не думаю, что мои неудачные попытки были бы очень полезным руководством. – Paul

ответ

0

Помимо новичка, было бы неплохо получить представление об основных структурах таблиц/баз данных, отношениях, использовании первичных/внешних ключей и, особенно, нормализации данных.

Что касается учебных запросов, которые я видел других люди используют SQL Zoo, как это имеет образец данных и охватывает образцы, как искать определенные вещи, которые требуют другого запроса, присоединяется, левый соединения, агрегаты и т.д.

Все при этом иногда бывает проще, если вы можете понимать запросы на основе ВАШИХ данных, а не какую-то общую базу данных примеров, в которой у вас нет контекста приложения к вашим данным.

Со всем этим сказанным, я помогу вам начать работу. Вам нужны агрегаты (min, max, avg, count), которые обычно применяются на основе столбцов (GROUP BY). В этом первом случае вы хотите найти «для каждого кандидата» (группа), и каждый «QUIZ» для этого CANDIDATE (также входящий в группу) вы хотите получить самый высокий тест.

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 имеют разный синтаксис, но чтобы лучше видеть эти тезисы, я буду делать жесткий код. Так как стержень является производным (использует первый запрос в качестве основы), первый запрос является основой шарнира.

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 

«ИФ()» применяется в качестве каждой строки попытка, и каждая строка будет только когда-либо иметь экземпляр 1 quizname, это будет только либо «Тест1», «Test2» или «Test3» , ЕСЛИ это тот правильный тест, а затем возьмите наивысший балл в качестве основы для показа в этом столбце результата. Последний столбец - простое среднее.

Последняя группа теперь хранит их в каждом кандидате, но на этот раз БЕЗ группы викторины в качестве внутреннего запроса.

+0

Благодарим вас за вашу огромную помощь. Первый набор кода, безусловно, работает. Тогда, я полагаю, мне нужно решить, как сохранить итоговую таблицу и использовать ее как вход для второго набора кода. Ссылка SQL Zoo также была полезна. – Paul

Смежные вопросы