(MYSQL)在列中显示每个学生的资格列表

时间:2014-01-22 21:08:27

标签: mysql sql

我有这个数据库和这些数据: http://sqlfiddle.com/#!2/b4cf72/1

我的想法是得到这个结果:

enter image description here

但我不知道如何在同一查询中显示列中的资格。

另一方面,我有另一个问题。有2名学生(141和143)表明他们没有任何考试资格。我不知道为什么会这样。他们的照片是红色的。

1 个答案:

答案 0 :(得分:2)

  

我不知道如何在同一查询中显示列中的资格。

目前,您没有适当的方法来区分所有pupil_id中的第二或第三次考试。使用id_qualificationdate不会削减它。 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 演示