[MySQL] 날짜별로 group by했을 때 없는 날짜도 출력하기

codeing999·2023년 3월 8일
0

MySQL

목록 보기
11/13

Q. mysql에서 날짜별로 group by를 했을 때 없는 날짜도 출력되게 하는 방법 알려줘

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는 날짜 데이터 형식으로 저장되어 있다고 가정합니다. 데이터가 다른 형식으로 저장된 경우, 조인 및 날짜 생성에 대한 구문을 조정해야합니다.

Q.더 간단한 방법은 없는가?

네, 더 간단한 방법이 있습니다. 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를 사용하여 결과를 표시합니다.

이렇게하면 데이터가 존재하지 않는 모든 날짜에 대한 결과가 표시됩니다.

profile
코딩 공부 ing..

0개의 댓글