Допустил ошибку в структуре таблицы. Как исправить?
Создайте отношение в таком виде: [id, dt, pupil_id, disc_id, value]. Для каждого ученика и предмета на нужную дату ставится оценка. Потом получаете все необходимые данные и рисуете по ним график. Другой плюс такой формы хранения в том, что сможете построить общий график успеваемости по дисциплине без учёта учеников, и другие аналитические запросы.
А обработку и вычищение данных перед тем, как отдать их в график, сделать разве не вариант? Даже если бы у вас там был NULL или любое другое значение — одним запросом вы бы не обошлись.
В четырех простых запросах нет ничего плохого. Индексы расставьте.
Либо разнесите данные на две таблицы, но придется написать скрипт миграции.