我有这个数据库和这些数据: http://sqlfiddle.com/#!2/b4cf72/1
我的想法是得到这个结果:
但我不知道如何在同一查询中显示列中的资格。
另一方面,我有另一个问题。有2名学生(141和143)表明他们没有任何考试资格。我不知道为什么会这样。他们的照片是红色的。
答案 0 :(得分:2)
我不知道如何在同一查询中显示列中的资格。
目前,您没有适当的方法来区分所有pupil_id
中的第二或第三次考试。使用id_qualification
或date
不会削减它。 id不一定是正确的顺序所以做日期。可以先为最后一次考试插入一行,然后为第一次考试插入一行。在这些插入之间,查询结果将不正确。从技术上讲,行可以使用date
进行枚举以进行排序,但同样又不可靠且速度慢。解决此问题的一种方法是使用指定的列来准确说明这是什么考试。
拥有这样的列,您可以使用条件聚合轻松生成必要的列。
另一方面,我有另一个问题。有2名学生(141和143)表明他们没有任何考试资格。
您可以通过这种方式正确计算每个id_pupil
的总计数
SELECT p.id_pupil, name, surname,
IFNULL(media, 0.00) media,
IFNULL(total_class, 0) total_class,
IFNULL(total_exams, 0) total_exams,
IFNULL(total_miss, 0) total_miss,
IFNULL(total_delay, 0) total_delay,
IFNULL(total_attitude, 0) total_attitude,
IFNULL(total_miss_justif, 0) total_miss_justif
FROM pupils p LEFT JOIN
(
SELECT p.id_pupil,
ROUND(AVG(CASE WHEN type_qualification='class'
THEN qualification END), 2) media,
SUM(type_qualification='class') total_class,
SUM(type_qualification='exam') total_exams
FROM pupils p JOIN qualifications q
ON p.id_pupil = q.id_pupil
WHERE p.level = 1
AND p.class = 'A'
AND q.id_trimester = 1
GROUP BY id_pupil
) q
ON p.id_pupil = q.id_pupil LEFT JOIN
(
SELECT p.id_pupil,
SUM(type_incident = 'miss') total_miss,
SUM(type_incident = 'delay') total_delay,
SUM(type_incident = 'attitude') total_attitude,
SUM(type_incident = 'miss_justif') total_miss_justif
FROM pupils p JOIN incidents i
ON p.id_pupil = i.id_pupil
WHERE p.level = 1
AND p.class = 'A'
AND i.id_trimester = 1
GROUP BY p.id_pupil
) i
ON p.id_pupil = i.id_pupil
WHERE p.level = 1
AND p.class = 'A';
输出:
| ID_PUPIL | NAME | SURNAME | MEDIA | TOTAL_CLASS | TOTAL_EXAMS | TOTAL_MISS | TOTAL_DELAY | TOTAL_ATTITUDE | TOTAL_MISS_JUSTIF | |----------|--------------|------------------|-------|-------------|-------------|------------|-------------|----------------|-------------------| | 140 | María | Adámez Nieto | 4 | 2 | 3 | 2 | 1 | 1 | 2 | | 141 | Daniel | Alonso Fernández | 6 | 3 | 2 | 0 | 0 | 0 | 0 | | 142 | Rocío | Anos Población | 4 | 1 | 3 | 1 | 1 | 0 | 1 | | 143 | Teresa | Arribas Miranda | 3.5 | 2 | 3 | 0 | 0 | 0 | 0 | | 144 | Isabel María | Barroso Suero | 5.5 | 2 | 2 | 1 | 0 | 0 | 1 |
这是 SQLFiddle 演示