MySQL запрос несовместимости - PullRequest
0 голосов
/ 21 ноября 2011

Следующий запрос дает разные результаты в разных строках, и он должен давать одинаковый результат во всех строках.

Вот запрос:

select * from 
    (SELECT mjla_db.StudentRecordTable2.studentId, 
            mjla_db.StudentTable2.lastName as `Last Name`, 
            mjla_db.StudentTable2.firstName as `First Name`, 
            sum(if(quizId=60,quizGrade,0)) as `Quiz 60`, 
            sum(if(quizId=64,quizGrade,0)) as `Quiz 64`, 
            sum(if(quizId=71,quizGrade,0)) as `Quiz 71`,
            (sum(quizGrade*(1-abs(sign(quizId-60)))) + 
                sum(quizGrade*(1-abs(sign(quizId-64)))) + 
                sum(quizGrade*(1-abs(sign(quizId-71)))) )/3 
                as Averages 
    FROM mjla_db.StudentRecordTable2, mjla_db.StudentTable2 
    where (mjla_db.StudentRecordTable2.studentId=mjla_db.StudentTable2.studentId) 
    GROUP BY studentId) as A 
where A.studentId 
in (select mjla_db.ClassStudentTable2.studentId 
    from mjla_db.ClassStudentTable2 
    where mjla_db.ClassStudentTable2.classId='CS3071F2011');

ЧислоТесты являются динамическими, число студентов является динамическим.


Вот содержимое таблицы, где mjla_db.StudentRecordTable2.classId='CS3071F2011'.

+-------------+-----------+-----------+--------+
| classId     | studentId | quizGrade | quizId |
+-------------+-----------+-----------+--------+
| CS3071F2011 | A1        |      NULL |     60 |
| CS3071F2011 | A2        |      NULL |     60 |
| CS3071F2011 | A5        |      NULL |     60 |
| CS3071F2011 | A1        |      NULL |     64 |
| CS3071F2011 | A2        |      NULL |     64 |
| CS3071F2011 | A5        |      NULL |     64 |
| CS3071F2011 | A7        |      NULL |     64 |
| CS3071F2011 | A3        |      NULL |     64 |
| CS3071F2011 | A4        |      NULL |     64 |
| CS3071F2011 | A3        |      NULL |     60 |
| CS3071F2011 | A4        |      NULL |     60 |
| CS3071F2011 | A7        |      NULL |     60 |
| CS3071F2011 | A1        |      NULL |     71 |
| CS3071F2011 | A2        |      NULL |     71 |
| CS3071F2011 | A5        |      NULL |     71 |
| CS3071F2011 | A7        |      NULL |     71 |
| CS3071F2011 | A3        |      NULL |     71 |
| CS3071F2011 | A4        |      NULL |     71 |
+-------------+-----------+-----------+--------+

Вот результат запроса.

+-----------+-----------+------------+---------+---------+---------+----------+
| studentId | Last Name | First Name | Quiz 60 | Quiz 64 | Quiz 71 | Averages |
+-----------+-----------+------------+---------+---------+---------+----------+
| A1        | harry     | thomas     |       0 |       0 |       0 |   0.0000 |
| A2        | harry     | willy      |       0 |       0 |       0 |   0.0000 |
| A3        | billy     | gregory    |       0 |       0 |       0 |   0.0000 |
| A4        | goat      | bobb       |       0 |       0 |       0 |   0.0000 |
| A5        | nogood    | tom        |       0 |       0 |       0 |     NULL |
| A7        | foobar    | dick       |       0 |       0 |       0 |     NULL |
+-----------+-----------+------------+---------+---------+---------+----------+

Ожидаемый результат запроса будет для всех средних равным 0,0000, почему последние два меняются?

Кроме того, всякий раз, когда я делаю запрос такчто я получаю только одного студента за раз, A5 и A7 по-прежнему отображаются как NULL, а остальные отображаются нормально ...


Решение этой проблемы или альтернативный запрос для достижения той же целибыть приемлемым.Моя цель состоит в том, чтобы получить таблицу, в которой каждая строка представляет представление каждого учащегося в классе и его оценки по всем тестам, а также среднее значение по всем тестам этого студента.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Все ваши значения quizGrade имеют значение NULL, которое вы используете в математических вычислениях ((sum(quizGrade*(1-abs(sign(quizId-60)))). Как только db NULL входит практически в любую операцию, вся операция становится пустой. почему последние два не имеют значения, но почему первые четыре не делают.

0 голосов
/ 21 ноября 2011

Для А7 нет оценки.Это возвращает NULL в среднем.Среднее значение всего, что имеет значение NULL, всегда будет равно NULL.

Самый простой способ исправить это - использовать функцию IFNULL.Это может заменить значение NULL чем-то другим.Как в:

(sum(ifnull(quizGrade*(1-abs(sign(quizId-60))),0)) + 
sum(ifnull(quizGrade*(1-abs(sign(quizId-64))),0)) + 
sum(ifnull(quizGrade*(1-abs(sign(quizId-71)))),0 )/3 
as Averages 

Надеюсь, я правильно разместил (.

0 голосов
/ 21 ноября 2011

Собираются ли ученики иметь более одной викторины для одной и той же викторины (в примере это один-к-одному, как мне кажется, должно быть)?Если нет, то вы можете использовать

 avg( if(quizGrade, quizGrade, 0) ) as Averages
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...