2016-08-03 5 views
0

Hello stack overflow 커뮤니티!MySQL 쿼리 - 구간의 합계

MySQL 쿼리에 약간의 문제가 있습니다. 내가 쫓고있는 것은 테이블에서 모든 Project_Cost의 합계를 반환하는 쿼리이지만 시간 프레임마다 다른 섹션으로 나누고 싶습니다. 저를위한 키커는 (예 : 6 월, 7 월, 8 월 등의 모든 비용)으로 나눠주고 싶다는 것입니다.

내가 설정 한 방법은 현재 하나씩 분할하는 것입니다. 현재 날짜로 결정됩니다. 그래서 본질적으로 이것은 달의 첫 번째 날에만 작동 할 것이며, 그 다음부터는 부정확합니다.

누군가 내가이 쿼리를 편집하여 내가 나중에 무엇을 할 수있게 도와 줄 수 있습니까? 나는 내가 본 접근법을 많이 테스트 해 왔지만, 내가 무엇을하고 있는지 나에게 알려주는 것은 아무것도 없다.

SELECT SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND NOW(),Project_Cost,0)) AS A, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -2 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -1 MONTH)),Project_Cost,0)) AS B, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -3 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -2 MONTH)),Project_Cost,0)) AS C, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -4 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -3 MONTH)),Project_Cost,0)) AS D, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -5 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -4 MONTH)),Project_Cost,0)) AS E, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -6 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -5 MONTH)),Project_Cost,0)) AS F, 
    SUM(IF(DateSigned BETWEEN DATE(DATE_ADD(NOW(), INTERVAL -7 MONTH)) AND DATE(DATE_ADD(NOW(), INTERVAL -6 MONTH)),Project_Cost,0)) AS G 
    FROM project 
    WHERE program = '1'; 
+0

당신은 할 수 있습니다 보기 [여기] (https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html); 그룹화/범위 대체를위한'MONTH'와 데이터 필터링을위한'LAST_DAY' 함수가 도움이 될 것으로 생각합니다. – Uueerdo

+0

내 생각에이 방법론은 잘못되었습니다. 여름철 테이블을 만들고 매월 말에이 데이터를 집계하는 크론 작업을하는 것이 좋지 않을까요? 유지 보수는 조금 더 많지만 사용이 간편함에 따라 성능이 훨씬 더 좋아질 것입니다. 유일한 문제는 데이터가 이번 달 밖에서 변경된 경우입니다. 많은 것들이 유스 케이스의 세부 사항에 달려 있지만,이 모든 것을 한꺼번에 집계하는 것은 큰 덩어리의 데이터를 요약해야하는 7 개 또는 8 개의 쿼리를 실행하는 것과 같습니다. 어떤 시점에서 정적이되면 왜 더 자주 한 번 쿼리하십시오. – ArtisticPhoenix

+0

그건 아주 공정한 지적이고, 저도 그렇게 생각했습니다. 궁극적으로 필자는이 쿼리를 변경하여 나중에 다른 메트릭을 제공 할 수있는 자유가 모든 쿼리 실행에 대한 단점보다 중요하다고 생각하기 때문에이를 반대했습니다. 또한, 프로젝트 비용은 서명 된 달의 외부에서 변경 될 수 있습니다. 이는 구현하기가 조금 어색 할 수 있습니다. – Mat

답변

0

당신은 달 비교할 YEAR(date)*12+MONTH(date)을 사용할 수 있습니다 내가 당신의 질문을 이해하지 될 수

SELECT SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now()),Project_Cost,0)) AS CurrentMonth, 
     SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now())-1,Project_Cost,0)) AS PreviousMonth, 
     SUM(IF(YEAR(DateSigned)*12+MONTH(DateSigned) = YEAR(Now())*12+MONTH(Now())-2,Project_Cost,0)) AS C 
     /* etc... */ 
FROM project 
WHERE program = '1' 
+0

정확히 내가 한 것입니다. 귀하의 성원에 진심으로 감사드립니다. 이것은 월별로 완벽하게 정렬됩니다. – Mat

0

를하지만하여 그룹을 보인다 (년) 달

SELECT year(DateSigned), month(DateSigned), sum(Project_Cost) 
from project 
WHERE program = '1' 
Group By year(DateSigned), month(DateSigned) 
+0

이것은 매우 좋은 해결책이었고 내가 무엇을했는지를 나에게 알려 주었다. 불행히도 while 루프를 실행해야만 나머지 구현체가이 시나리오에서 상당히 엉망이되었습니다. – Mat