MySQL에서 날짜별로 GROUP BY를 실행할 때, 결과에는 존재하는 모든 날짜가 포함되지 않을 수 있습니다.
하지만, 모든 날짜를 표시하기 위해서는 먼저 데이터베이스에 표시하고자 하는 날짜 범위를 생성해야합니다. 그런 다음, 생성한 날짜 범위를 사용하여 LEFT JOIN을 사용하여 결과를 생성할 수 있습니다.
다음은 예시 쿼리입니다.
SELECT date_table.date, COUNT(sales_table.sales) as sales_total
FROM
(
SELECT DATE('2023-03-01') + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as date
FROM
(SELECT 0 as a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) as a,
(SELECT 0 as a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) as b,
(SELECT 0 as a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) as c
) as date_table
LEFT JOIN sales_table ON date_table.date = DATE(sales_table.sales_date)
GROUP BY date_table.date
위의 쿼리에서는 날짜 범위를 생성하기 위해 DATE('2023-03-01')을 시작 날짜로 사용하고, INTERVAL 및 SELECT 문을 사용하여 10,000개의 연속적인 날짜를 생성합니다.
다음으로, LEFT JOIN을 사용하여 생성한 날짜 범위와 sales_table을 조인하고, GROUP BY를 사용하여 결과를 표시합니다. 이렇게하면 데이터가 존재하지 않는 모든 날짜에 대한 결과가 표시됩니다.
참고: sales_table.sales_date는 날짜 데이터 형식으로 저장되어 있다고 가정합니다. 데이터가 다른 형식으로 저장된 경우, 조인 및 날짜 생성에 대한 구문을 조정해야합니다.
네, 더 간단한 방법이 있습니다. MySQL 8.0 버전부터는 GENERATE_SERIES 함수를 사용하여 누락된 날짜를 생성할 수 있습니다.
다음은 예시 쿼리입니다.
SELECT dates.d, COUNT(sales.sales) as sales_total
FROM (
SELECT DATE('2023-03-01') + INTERVAL seq DAY as d
FROM GENERATE_SERIES(0, DATEDIFF('2023-03-31', '2023-03-01')) as s(seq)
) as dates
LEFT JOIN sales ON dates.d = sales.sales_date
GROUP BY dates.d;
위의 쿼리에서는 GENERATE_SERIES 함수를 사용하여 날짜 범위를 생성합니다. seq 변수를 사용하여 시작 날짜와 끝 날짜 사이의 날짜 수를 계산하고, INTERVAL을 사용하여 시작 날짜에 일 수를 추가하여 모든 날짜를 생성합니다.
그런 다음, 생성된 날짜 범위를 사용하여 LEFT JOIN을 사용하여 sales 테이블과 조인하고, GROUP BY를 사용하여 결과를 표시합니다.
이렇게하면 데이터가 존재하지 않는 모든 날짜에 대한 결과가 표시됩니다.