2011-04-07 3 views
0

내가 가진 아래 DB 테이블 :는 SQL 쿼리에 도움이 필요

SELECT YEAR(TargetEnd) 'YEAR', 
    MONTHNAME(TargetEnd) 'MONTH', 
    SUM(IF(TaskStatus = 'ongoing',1,0)) 'ONGOING', 
    SUM(IF(TaskStatus = 'completed',1,0)) 'COMPLETED', 
    COUNT(TaskId) 'TOTAL' FROM Task_Table GROUP BY YEAR(TargetEnd), MONTH(TargetEnd) 

그 결과는 다음과 같습니다 난 총이 완료 매월 진행중인 작업을 얻을 수있는 내가 쿼리를 생성

 
TaskId StartDate TargetEnd TaskStatus 
1  2011-01-01 2011-02-05 completed 
2  2011-02-05 2011-02-05 ongoing 
3  2011-02-04 2011-04-04 completed 
4  2011-04-04 2011-04-04 completed 
5  2011-04-06 2011-04-30 ongoing 

: 작업은 012,321에서 여전히 "진행"동안

 
    YEAR MONTH ONGOING COMPLETED TOTAL 
    2011 January 0  1  1 
    2011 February 0  1  2 
    2011 April  1  2  3 

하지만 내 요구 사항은 ONGOING의 일환으로 작업 # 2를 추가하는 것입니다개월 (최대 2 월 - 4 월). 예상되는 내용은 다음과 같아야합니다.

 
    YEAR MONTH ONGOING COMPLETED TOTAL 
    2011 January 0  0  0 
    2011 February 1  1  1 
    2011 March  1  0  1 
    2011 April  2  2  4 

이 작업을 수행하는 방법에 대한 아이디어를 제공해 주시겠습니까? 어떤 도움을 주셔서 감사합니다. 감사.


위의 예상 결과를 편집했습니다. 카운트는 대상을 기반으로하기 때문에 1 월에는 카운트가 없어야합니다.의 달입니다.

+0

각 입력 레코드를 어떻게 처리 할 것인지 예를 보여줄 수 있습니까? 그렇다면 입력 한 결과가 최종 결과에 어떻게 반영 될 수 있습니까? – MatBailie

+0

테이블에 표시된 달을 검색하는 대신 테이블에 표시된 _first_ 개월부터 'NOW()'까지 검색하고 각 행의 다양한 값을 비교하는 조인을해야합니다. wrt 그 달은 반복된다. –

답변

1

정확하게 이해할 수 있다면 ...
- 레코드가 완료로 표시되면 completed 값에 1을, 완료 한 달에만 기여해야합니다.
- 레코드가 진행 중으로 표시되면 시작한 이후 매월 ongoing 값에 1을 기여해야합니다.

첫 번째 문제는 3 월 월에 입력 데이터에 일치 레코드가 없기 때문입니다. 내가 선호하는 방법은 월 조회 테이블을 만드는 것입니다.

SELECT 
    lookup.month, 
    SUM(CASE WHEN task_table.TaskStatus = 'Completed' THEN 1 ELSE 0 END) AS completed, 
    SUM(CASE WHEN task_table.TaskStatus = 'Ongoing' THEN 1 ELSE 0 END) AS completed, 
    COUNT(task_table.TaskStatus) AS total 
FROM 
    lookup 
LEFT JOIN 
    task_table 
    ON 
    (
     task_table.TaskStatus = 'Completed' 
     AND lookup.month <= task_table.Target_End 
     AND lookup.month > task_table.Target_End - INTERVAL '1 month' 
    ) 
    OR 
    (
     task_table.TaskStatus = 'Ongoing' 
     AND lookup.month <= task_table.Target_End 
     AND lookup.month > task_table.Start_Date - INTERVAL '1 month' 
    ) 
WHERE 
     lookup.month >= '2011-01-01' 
    AND lookup.month <= '2011-04-01' 
GROUP BY 
    lookup.month 
+0

맞습니다. 레코드가 완료되면 ** TargetEnd ** 월에 한 번만 계산됩니다. 나는 너의 제안을 시도 할 것이다. 아이디어 공유에 많은 시간을 할애 해 주셔서 감사합니다. – Brenard

+0

나는 당신의 제안에 기초하여 예상 된 결과를 얻는 방법을 아직도 이해할 수 없다. : ( – Brenard

+0

나는 각 입력 레코드가 제안 된 출력으로 어떻게 재구성되는지에 대한 자세한 정보를 제공해야한다고 생각합니다. – MatBailie