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';
당신은 할 수 있습니다 보기 [여기] (https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html); 그룹화/범위 대체를위한'MONTH'와 데이터 필터링을위한'LAST_DAY' 함수가 도움이 될 것으로 생각합니다. – Uueerdo
내 생각에이 방법론은 잘못되었습니다. 여름철 테이블을 만들고 매월 말에이 데이터를 집계하는 크론 작업을하는 것이 좋지 않을까요? 유지 보수는 조금 더 많지만 사용이 간편함에 따라 성능이 훨씬 더 좋아질 것입니다. 유일한 문제는 데이터가 이번 달 밖에서 변경된 경우입니다. 많은 것들이 유스 케이스의 세부 사항에 달려 있지만,이 모든 것을 한꺼번에 집계하는 것은 큰 덩어리의 데이터를 요약해야하는 7 개 또는 8 개의 쿼리를 실행하는 것과 같습니다. 어떤 시점에서 정적이되면 왜 더 자주 한 번 쿼리하십시오. – ArtisticPhoenix
그건 아주 공정한 지적이고, 저도 그렇게 생각했습니다. 궁극적으로 필자는이 쿼리를 변경하여 나중에 다른 메트릭을 제공 할 수있는 자유가 모든 쿼리 실행에 대한 단점보다 중요하다고 생각하기 때문에이를 반대했습니다. 또한, 프로젝트 비용은 서명 된 달의 외부에서 변경 될 수 있습니다. 이는 구현하기가 조금 어색 할 수 있습니다. – Mat