MySQL에서 조회 조건을 현재월을 기준으로 1개월 전의 말일, 현재월의 말일의 다음날로 셋팅을 합니다.
예시를 들면 오늘이 7월 15일일 때, 위의 쿼리문을 보면 6월 30일 AND 8월 1일이 됩니다.
날짜 뒤의 시간은 00:00:00 으로 자동으로 만들어지 때문에 7월 1일 ~ 7월 31일 까지로 데이터를 가져옵니다.
즉, 각 월별로 데이터 조회가 가능하게 되는 거죠.
WHERE reg_date BETWEEN LAST_DAY(STR_TO_DATE($search_month,'%Y%m%d') - INTERVAL 1 MONTH)
AND LAST_DAY(STR_TO_DATE($search_month,'%Y%m%d')) + INTERVAL 1 DAY
PHP, MySQL 월별로 데이터를 조회하는 방법 - date, mktime, LAST_DAY, INTERVAL
- SUM(price) : 전체 매출을 집계합니다. - SUM(CASE WHEN comp = 'A' THEN price ELSE 0 END) : A 상품의 매출만 집계합니다. - GROUP BY dept WITH ROLLUP : 전체 합계를 Row로 보여줍니다. - COALESCE(dept, '합계') : 마지막 Row의 칼럼 내용을 합계로 보여줍니다.
// ROLLUP 집계 함수
SELECT COALESCE(dept, '합계') AS dept,
SUM(price) total,
SUM(CASE WHEN comp = 'A' THEN price ELSE 0 END) A,
SUM(CASE WHEN comp = 'B' THEN price ELSE 0 END) B,
SUM(CASE WHEN comp = 'C' THEN price ELSE 0 END) C
FROM TABLE
WHERE date BETWEEN STR_TO_DATE('[시작날짜]','%Y-%m-%d %H:%i:%s')
AND STR_TO_DATE('[종료일]','%Y-%m-%d %H:%i:%s')
GROUP BY dept WITH ROLLUP
기간 전체 누적을 같이 보여주기 위해서 UNION ALL을 사용하였습니다. 첫번째 SQL은 전체 누적 데이터이고 두번째 SQL은 현재일 기준으로 전일 데이터를 가져오 일자별로 데이터를 출력하게 합니다.
/* 실적 집계하기 (누적/전일/오늘) */
SELECT '현재까지 누적' reg_date,
SUM(price) total
FROM TABLE
WHERE p_date BETWEEN DATE_FORMAT(CONCAT(DATE_FORMAT( NOW(),'%Y-%m'),'-1'),'%Y-%m-%d')
AND DATE_FORMAT( NOW(), '%Y-%m-%d 23:29:55' )
UNION ALL
SELECT DATE_FORMAT(reg_date, '%Y-%m-%d') reg_date,
SUM(price) total
FROM TABLE
WHERE p_date BETWEEN DATE_FORMAT( DATE_ADD(NOW(), INTERVAL - 1 DAY), '%Y-%m-%d 00:00:00' )
AND DATE_FORMAT( NOW(), '%Y-%m-%d 23:29:55' )
GROUP BY DATE_FORMAT(reg_date, '%Y-%m-%d')