Как сказал rwilliams, не рекомендуется хранить age_tested, поскольку он избыточен, но если это то, что вы хотите сделать, вы можете обернуть простой триггер вокруг решения Мости -
CREATE TRIGGER fitness_report_insert BEFORE INSERT ON `fitness_report`
FOR EACH ROW
BEGIN
SET NEW.age_tested = (SELECT DATE_FORMAT(NEW.test_period, '%Y') - DATE_FORMAT(student.date_of_birth, '%Y') - (DATE_FORMAT(NEW.test_period, '00-%m-%d') < DATE_FORMAT(student.date_of_birth, '00-%m-%d')) FROM student WHERE student.student_id = NEW.student_id);
END
Предполагается, что test_period - это дата, упомянутая ранее Мости. Я не пробовал этого, так как сейчас у меня нет доступа к серверу, поэтому может потребоваться небольшая настройка.
ОБНОВЛЕНИЕ: Вы можете попробовать следующее в качестве отправной точки для вашей статистики -
SELECT
DATE_FORMAT(test_period, '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(test_period, '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age,
s.gender,
AVG(r.score) AS score
FROM student s
INNER JOIN fitness_report r
ON s.student_id = r.student_id
GROUP BY age, s.gender