> 데이터 베이스 > MySQL 튜토리얼 > MySQL 집계 쿼리의 날짜 간격을 0으로 채우는 방법은 무엇입니까?

MySQL 집계 쿼리의 날짜 간격을 0으로 채우는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-23 06:21:22
원래의
677명이 탐색했습니다.

How to Fill Date Gaps in MySQL Aggregate Queries with Zeroes?

MySQL의 날짜 공백 채우기

문제:

특정 날짜에 대한 집계 데이터를 추출하려면 , MySQL 쿼리가 사용됩니다. 그러나 반환된 결과 집합에는 데이터가 있는 날짜만 포함되어 데이터가 없는 날짜 사이에 공백이 남습니다. 목표는 이러한 간격을 0으로 채워 연속적인 날짜 범위를 만드는 것입니다.

해결책:

이를 달성하려면 도우미 테이블이 필요합니다. 이 테이블에는 원하는 시작 날짜부터 원하는 종료 날짜까지의 모든 날짜가 포함됩니다.

CREATE TABLE dates (
  dt DATE NOT NULL,
  PRIMARY KEY (dt)
);
로그인 후 복사

도우미 테이블은 쿼리를 사용하여 채울 수 있습니다.

INSERT INTO dates (dt)
SELECT DATE(posted_at)
FROM messages
WHERE brand_id = 1
AND spam = 0
AND duplicate = 0
AND ignore = 0
GROUP BY DATE(posted_at)
UNION
SELECT DATE('2023-01-01') + INTERVAL i-1 DAY
FROM (
  SELECT 1 AS i 
  UNION ALL
  SELECT i + 1 FROM <table> WHERE i < DATEDIFF('2023-12-31', '2023-01-01')
) AS i;
로그인 후 복사

'2023-01 바꾸기 -01'과 '2023-12-31'을 원하는 시작일과 종료일로 입력하세요.

다음으로 도우미는 테이블은 원래 쿼리로 LEFT JOIN을 수행하는 데 사용됩니다.

SELECT  d.dt AS date,
        COUNT(*) AS total,
        SUM(attitude = 'positive') AS positive,
        SUM(attitude = 'neutral') AS neutral,
        SUM(attitude = 'negative') AS negative
FROM    dates d
LEFT JOIN
        messages m
ON      m.posted_at >= d.dt
        AND m.posted_at < d.dt + INTERVAL 1 DAYS
        AND spam = 0
        AND duplicate = 0
        AND ignore = 0
GROUP BY
        d.dt
ORDER BY
        d.dt
로그인 후 복사

이 수정된 쿼리는 원래 테이블에 데이터가 없는 날짜를 포함하여 0으로 채워진 모든 날짜가 포함된 원하는 결과 집합을 반환합니다.

위 내용은 MySQL 집계 쿼리의 날짜 간격을 0으로 채우는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿