차원의 모든 달에 대한 값을 제공하는 행 소스가 필요하며 yearly_sales 테이블을 왼쪽으로 조인하면됩니다.
GROUP BY를 수행 중이며 측정 값 (sales_amount_sold)에 집계가 있거나 GROUP BY를 원하지 않을 가능성이 큽니다. (귀하의 질문에 쿼리 그건 당신이 원하는 것을 할 수있다. 주어진 달에 하나의 행에 대해 sales_amount_sold에서 값을 반환하는 것입니다,하지만 매우 이상한 결과 집합을 반환 할 수 있습니다.)
한 가지 방법이다 "calendar_month"테이블에 반환하고자하는 모든 달의 DATE 값을 포함해야합니다.
SELECT m.month AS sale_date
, IFNULL(SUM(s.sales_amount_sold),0) AS sale_amt
FROM calendar_months m
LEFT
JOIN yearly_sales s
ON s.sales_date_sold >= m.month
AND s.sales_date_sold < DATE_ADD(m.month,INTERVAL 1 MONTH)
WHERE m.month BETWEEN DATE_SUB(SYSDATE(), INTERVAL 2 YEAR) AND SYSDATE()
GROUP BY m.month
ORDER BY m.month
이 쿼리는 약간 다른 결과를 반환합니다 (이 생성하는 다른 방법, 다른 곳에서 유래에 대한 질문에 대한 기존의 답변이 있습니다), 당신은 단지 "전체 개월 '의 그룹 행을 얻을 것보다는 포함된다 sales_date의 WHERE 절이 2 년 전에 "첫 번째 달"이 아닌 현재 날짜와 시간보다 2 년 앞선 것을 참조하기 때문에 원래 쿼리에서와 같이 부분적인 월을 사용합니다.
calendar_months 테이블은 반드시 필요하지 않습니다. 이것은 행 원본을 반환하는 쿼리로 대체 될 수 있습니다. 이 경우 월 값의 술어를 외부 쿼리에서 하위 쿼리로 이동할 수 있습니다.
부록 : 당신이 행 원본으로 calendar_month 테이블을 사용하는 경우, 당신은 반환 할 모든 가능한 "달"값으로 채 웁니다해야합니다.
CREATE TABLE calendar_month
(`month` DATE NOT NULL PRIMARY KEY COMMENT 'one row for first day of each month');
INSERT INTO calendar_month(`month`) VALUES ('2011-01-01'),('2011-02-01'),('2011-03-01')
대안으로
, 당신은 인라인보기보다는 테이블 참조로, 동적으로 생성 된 행 원본을 지정할 수 있습니다. (비슷한 쿼리를 사용하여 calendar_months 테이블을 빠르게 채울 수 있습니다.)
이 쿼리를 괄호로 묶은 다음 이전 쿼리에서 FROM
과 calendar_months
사이에 붙여 넣을 수 있습니다.
SELECT DATE_ADD('1990-01-01',INTERVAL 1000*thousands.digit + 100*hundreds.digit + 10*tens.digit + ones.digit MONTH) AS `month`
FROM (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ones
JOIN (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) tens
JOIN (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) hundreds
JOIN (SELECT 0 AS digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) thousands
(가독성을 위해 쿼리 텍스트의 형식을 변경하여 서식을 다시 지정) – spencer7593