2012-07-27 3 views
0

결과 집합이 나열된 결과 테이블이 있습니다. 각 결과 집합은 결과가 만들어진 다른 테이블로 연결됩니다.MySQL을 여러 날짜와 결과로 그룹화 합계 사례를 사용하여

나는 (CASE의를 사용하여) 모든 날짜를 가져 오기 위해 SQL을 사용하고 있지만 단 하나의 결과 범위 만 검색 할 수 있습니다.

Select 
    count(CASE 
    WHEN results.test_id IN (SELECT id 
    FROM `test` 
    WHERE `posted` 
    BETWEEN '2011-07-01 00:00:00' 
    AND '2011-07-01 23:59:59') 
    THEN results.test_id 
    ELSE NULL 
     END) AS "1st July"   
    from `results` 
    WHERE results.window_id = 2 and results.mark > 90; 

또한 모든 범위를 가져 오지만 한 번에 하나의 날짜에만 작동 할 수있는 또 다른 SQL 쿼리가 있습니다.

SELECT 
CASE 
    when mark > 90 then '>90%' 
    when mark > 80 then '>80%' 
    when mark > 70 then '>70%' 
END as mark_results, 
COUNT(*) AS count 

FROM (SELECT mark from results where window_id =2) as derived 
GROUP BY mark_results 
ORDER BY mark_results; 

내가 원하는 것은 모든 결과 범위에 대해 관련 합계를 표시하는 단일 쿼리에서 모든 것을 갖는 것입니다.

Result Range | 1st July | 2nd July | 3rd July | 4th July 
>90%   | 0  | 0  | 0  | 1 
>80%   | 1  | 2  | 1  | 1 
>70%   | 4  | 5  | 5  | 4 

각 범위의 합계가 해당 날짜 아래에 표시됩니다.

나는 그것이 가능하다고 생각합니다.

+0

나는 그것이 가능하지 않다고 생각합니다. 쿼리에는 여러 개의 열을 사용할 수 없습니다. - 변수를 오프셋 날짜 (첫 번째 날짜 열의 날짜)로 설정 한 다음 date_add() 함수를 사용하여 다른 열을 정의하여 쿼리를 다소 유연하게 유지하는 것이 가능해야합니다. 그러나 데이터가 전혀없는 열의 경우에도 고정 된 수의 날짜 열을 사용해야합니다. –

답변

3

다음 문은 FROM 절의 결과와 테스트를 결합합니다. 그런 다음 쿼리 범위를 기준으로 일일 카운트와 함께 집계합니다.

Select (CASE when mark > 90 then '>90%' 
      when mark > 80 then '>80%' 
      when mark > 70 then '>70%' 
     END) as mark_results, 
    sum(case when posted BETWEEN '2011-07-01 00:00:00' AND '2011-07-01 23:59:59' then 1 else 0 end) as July01, 
    sum(case when posted BETWEEN '2011-07-02 00:00:00' AND '2011-07-02 23:59:59' then 1 else 0 end) as July02, 
    . . . 
from `results` r join 
    test t 
    on r.test_id = t.test_id 
WHERE r.window_id = 2 and results.mark > 90 
group by (CASE when mark > 90 then '>90%' 
       when mark > 80 then '>80%' 
       when mark > 70 then '>70%' 
      END) 
order by 1 

원하는 절을 SELECT 절에 추가하기 만하면됩니다.

추가해야합니다. . . 당신은 모든 날짜를 원하는 경우, 별도의 행에 넣어해야합니다

Select date(posted) as PostedDate, 
     (CASE when mark > 90 then '>90%' 
      when mark > 80 then '>80%' 
      when mark > 70 then '>70%' 
     END) as mark_results, 
    count(*) as cnt 
    . . . 
from `results` r join 
    test t 
    on r.test_id = t.test_id 
WHERE r.window_id = 2 and results.mark > 90 
group by date(posted), 
     (CASE when mark > 90 then '>90%' 
       when mark > 80 then '>80%' 
       when mark > 70 then '>70%' 
      END) 
order by 1, 2 

는 사실, 당신은 열로 피벗 범위로, 각 날짜에 대해 별도의 행을 가지고 고려할 수 있습니다.

관련 문제