2013-11-21 2 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 | 
+-----------+--------+ 

내가 정확히 코스처럼 새 열을하고 싶은,하지만 결석했다.

내 부재의 열은 다음과 같습니다 ID, USER_ID는 , 이유를 Course_ID에

그래서,이 카운트 부재로하여 코스 그룹을 사용할 수 있습니다 정당화?

그렇다면 어떻게됩니까? 사전에

감사합니다,

편집 : 지금이 쿼리가

:

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을 부여하는 방법이 있습니까?

편집 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

모든 학생에게 보시겠습니까? 아니면 학생 ID를 매개 변수로 제공 하시겠습니까? –

답변

1

이 시도 :

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

이것은 매력처럼 작동합니다! 감사합니다 Filipe! 긴 이야기 짧은, 내부와 왼쪽의 차이점은 무엇입니까? –

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

답장을 보내 주셔서 감사합니다. 당신과 Filipe는 정확히 같은 쿼리를 가지고 있습니다. 왼쪽 누락 된 행을 추가합니다. 내 새로운 문제에 대한 힌트가 있으십니까? –