2016-11-11 2 views
0

현재 교실 당 학생 수를 계산하려고합니다. (<> '00 DropTime : 00 '과 PickupTime = '00 : 00') ClassroomID이 < 99 교실에서유니온 MYSQL의 GROUP BY

  1. 모든 학생이 : 그리고 날짜가 20161111

  2. 조건은 및 날짜 내가 일을 사용하고 20,161,111

입니다 : ClassroomId는> (99)와이 (00 'DropTime = 00)이 교실에서

  • 모든 학생들입니다 전자 MySQL의 쿼리 다음과 잘 작동하고 내가 올바른 결과를 얻을 : 나는 다른 교실에 대한 결과를 얻기 위해 노동 조합을 수행하려고 할 때를 제외하고

    SELECT 
        COUNT(a.Id) AS total, c.Name 
    FROM 
        Attendance a 
    INNER JOIN 
        Classroom c ON a.classroom = c.Id 
    WHERE 
        DropDate = '20161111' 
    AND DropTime <> '00:00' 
    AND PickupTime = '00:00' 
    GROUP BY Name 
    

    를 (예를 ClassroomID은> 99) 각을 가져 오지 않는다 총 교실 수는 1 교실입니다. 이것은 내가 사용하고있는 통합 쿼리입니다.

    SELECT 
    SUM(total), Name 
    FROM 
    (SELECT 
        COUNT(a.Id) AS total, c.Name 
    FROM 
        Attendance a 
    INNER JOIN Classroom c ON a.classroom = c.Id 
    WHERE 
        DropDate = '20161111' 
         AND DropTime <> '00:00' 
         AND PickupTime = '00:00' 
         AND c.Id < 99 
    UNION ALL 
        SELECT 
        COUNT(a.Id) AS total, c.Name 
    FROM 
        Attendance a 
    INNER JOIN Classroom c ON a.classroom = c.Id 
    WHERE 
        DropDate = '20161111' 
         AND PickupTime = '00:00' 
         AND c.Id > 99) t 
    GROUP BY Name 
    
  • 답변

    1

    그룹화 기준은 각 집계에 적절해야합니다. 따라서 세 가지 그룹이 필요합니다. 1은 각각의 통합 문에 대해 모두 집계하고 하나는 외부 선택을위한 것입니다.

    다른 식으로 말하자면, 각 쿼리는 다른 쿼리 내에서 작동하기 전에 자체 쿼리에서 작동 할 수 있어야합니다. 두 개의 인라인 쿼리는 대부분의 RDBMS 시스템에서 실패 할 수 있습니다. 그러나 MYSQL의 확장 된 그룹은이를 복잡하게 만듭니다.

    그러나 쿼리를 작성하는 데 더 효율적인 방법이있을 수 있습니다. 그러나 여기에 귀하의 초기 시도를 기반으로 한 작업 버전이 있습니다.

    SELECT 
    SUM(total), Name 
    FROM 
    (SELECT 
        COUNT(a.Id) AS total, c.Name 
    FROM 
        Attendance a 
    INNER JOIN Classroom c ON a.classroom = c.Id 
    WHERE 
        DropDate = '20161111' 
         AND DropTime <> '00:00' 
         AND PickupTime = '00:00' 
         AND c.Id < 99 
    GROUP BY c.name 
    UNION ALL 
        SELECT 
        COUNT(a.Id) AS total, c.Name 
    FROM 
        Attendance a 
    INNER JOIN Classroom c ON a.classroom = c.Id 
    WHERE 
        DropDate = '20161111' 
         AND PickupTime = '00:00' 
         AND c.Id > 99 
    GROUP BY c.name) t 
    GROUP BY t.name 
    

    이것은 더 간단 것으로 나타나고 (제공 내가 뭔가를 망치지 않았다) 같은 결과를 달성해야하며, 더 빨리는 3 개 가지 세트를 생성 한 다음 결합 할 필요가 없기 때문에해야한다.

    SELECT COUNT(a.Id) AS total 
        , c.Name 
    FROM Attendance a 
    INNER JOIN Classroom c 
        ON a.classroom = c.Id 
    WHERE DropDate = '20161111' 
        AND ((DropTime <> '00:00' AND PickupTime = '00:00' AND c.Id < 99) 
        OR (PickupTime = '00:00' AND c.Id > 99)) 
    GROUP BY c.name 
    
    +0

    감사합니다. – snowflakes74