2013-11-21 4 views
1

Я застрял в этом вопросе, и я хотел бы иметь руку.Два COUNT и GROUP BY

Итак, у меня есть две таблицы: курс и отсутствие.

Целью моего запроса является подсчет для ученика всех его курсов и пропусков за каждый месяц года.

Только с курсами, у меня есть этот запрос:

SELECT DATE_FORMAT(c.date, "%M") AS month, 
     COUNT(*) AS courses 
FROM Course c 
GROUP BY month 
ORDER BY MONTH(c.date); 

Результат выглядит следующим образом:

+-----------+--------+ 
| month  | courses| 
+-----------+--------+ 
| January |  24 | 
| February |  20 | 
| March  |  20 | 
| April  |  22 | 
| May  |  23 | 
| June  |  20 | 
| July  |  23 | 
| August |  22 | 
| September |  20 | 
| October |  23 | 
| November |  23 | 
| December |  21 | 
+-----------+--------+ 

Я хотел бы иметь новую колонку, точно так же как курсы одного, но за отсутствия.

мое отсутствие столбцы: идентификатор, user_id, course_id, разум, оправдан

Таким образом, это можно использовать группу курсов с отсутствием рассчитывать?

Если да, то как?

Спасибо заранее,

EDIT:

У меня сейчас этот вопрос:

SELECT a.month, a.courses, b.absences 
FROM (SELECT DATE_FORMAT(c.DATE, "%M") AS month, 
      COUNT(*) AS courses 
     FROM Course c 
     GROUP BY month) a 
INNER JOIN (SELECT DATE_FORMAT(c.date, "%M") AS month, 
        COUNT(*) AS absences 
      FROM Absence a 
      LEFT JOIN Course c 
      ON a.course_id = c.id 
      GROUP BY month) b 
ON a.month = b.month; 

И результат:

+----------+---------+----------+ 
| month | courses | absences | 
+----------+---------+----------+ 
| November |  23 |  2 | 
| October |  23 |  1 | 
+----------+---------+----------+ 

Номера хорошие, но когда нет пропусков, курсы не показаны. Есть ли способ иметь 0 на отсутствие?

EDIT 2:

Это рабочий вопрос:

SELECT a.month, a.courses, b.absences 
FROM (SELECT DATE_FORMAT(c.DATE, "%M") AS month, 
      COUNT(*) AS courses 
     FROM Course c 
     GROUP BY month) a 
LEFT JOIN (SELECT DATE_FORMAT(c.date, "%M") AS month, 
        COUNT(*) AS absences 
      FROM Absence a 
      LEFT JOIN Course c 
      ON a.course_id = c.id 
      GROUP BY month) b 
ON a.month = b.month; 
+0

Хотите ли вы видеть его для всех студентов или вы укажете идентификатор студента в качестве параметра? –

ответ

1

Try это:

SELECT a.month, a.courses, b.absences 
FROM (SELECT DATE_FORMAT(c.DATE, "%M") AS month, 
      COUNT(*) AS courses 
     FROM Course c 
     GROUP BY month) a 
LEFT JOIN (SELECT DATE_FORMAT(c.date, "%M") AS month, 
        COUNT(*) AS absences 
      FROM Absence a 
      LEFT JOIN Course c 
      ON a.course_id = c.id 
      GROUP BY month) b 
ON a.month = b.month; 

Это два подзапроса, один, чтобы найти количество курсов и один для отсутствия. Затем вы присоединитесь к ним к месяцу.

Он должен предоставить вам то, что вы ищете.

+0

Спасибо. Вам не хватало того факта, что Отсутствие не имеет даты, но связано с курсом. Я добавил левое соединение. Пожалуйста, взгляните на мое редактирование. –

+0

Просто измените INNER JOIN на LEFT JOIN. Он должен дать вам то, что вы хотите. –

+0

Это работает как шарм! Спасибо, Филипе! Короче говоря, какая разница между внутренней и левой? –

0

Вы должны быть в состоянии сделать это с видом инлайн:

SELECT c.month, c.courses, a.absences 
FROM (
     SELECT DATE_FORMAT(date, "%M") AS month, 
       COUNT(*) AS courses 
     FROM Course 
     GROUP BY month 
    ) AS c 
     JOIN (
       SELECT DATE_FORMAT(date, "%M") AS month, 
        COUNT(*) AS absences 
       FROM Absence 
       GROUP BY month 
      ) AS a 
     ON a.month = c.month 
ORDER BY c.month 
+0

Спасибо вам за ответ. У вас и Филипе есть точно такой же запрос. Я добавляю недостающее левое соединение. Есть подсказка для моей новой проблемы? –