如何返回零导致列,如果在ADDED_DATE没有发现MySQL查询

问题描述:

MySQL查询没有值,以获得结果ADDED_DATE记录:如何返回零导致列,如果在ADDED_DATE没有发现MySQL查询

SELECT added_date, count(added_date) AS result 
FROM reports 
WHERE added_date BETWEEN '2017-08-01' AND '2017-08-10' 
GROUP BY added_date 

查询结果:

added_date result 
2017-08-01 20 
2017-08-02 10 
2017-08-04 22 
2017-08-08 1 

我想结果为:

added_date result 
    2017-08-01 20 
    2017-08-02 10 
    2017-08-03 0 
    2017-08-04 22 
    2017-08-05 0 
    2017-08-06 0 
    2017-08-07 0 
    2017-08-08 1 
+0

的可能的复制[mysql如何填写范围缺少的日期?(https://stackoverflow.com/questions/ 3538858/MySQL的 - 如何对填充失踪日期,在范围内) – Riedsio

如下面的代码所示。您可以创建日历表。其中提供我们所需的确切日历。进入该日历表。

DROP TABLE IF EXISTS time_dimension; 

CREATE TABLE time_dimension (
     id      INTEGER PRIMARY KEY, -- year*10000+month*100+day 
     db_date     DATE NOT NULL, 
     year     INTEGER NOT NULL, 
     month     INTEGER NOT NULL, -- 1 to 12 
     day      INTEGER NOT NULL, -- 1 to 31 
     quarter     INTEGER NOT NULL, -- 1 to 4 
     week     INTEGER NOT NULL, -- 1 to 52/53 
     day_name    VARCHAR(9) NOT NULL, -- 'Monday', 'Tuesday'... 
     month_name    VARCHAR(9) NOT NULL, -- 'January', 'February'... 
     holiday_flag   CHAR(1) DEFAULT 'f' CHECK (holiday_flag in ('t', 'f')), 
     weekend_flag   CHAR(1) DEFAULT 'f' CHECK (weekday_flag in ('t', 'f')), 
     event     VARCHAR(50), 
     UNIQUE td_ymd_idx (year,month,day), 
     UNIQUE td_dbdate_idx (db_date) 

) Engine=MyISAM; 

DROP PROCEDURE IF EXISTS fill_date_dimension; 
DELIMITER // 
CREATE PROCEDURE fill_date_dimension(IN startdate DATE,IN stopdate DATE) 
BEGIN 
    DECLARE currentdate DATE; 
    SET currentdate = startdate; 
    WHILE currentdate < stopdate DO 
     INSERT INTO time_dimension VALUES (
         YEAR(currentdate)*10000+MONTH(currentdate)*100 + DAY(currentdate), 
         currentdate, 
         YEAR(currentdate), 
         MONTH(currentdate), 
         DAY(currentdate), 
         QUARTER(currentdate), 
         WEEKOFYEAR(currentdate), 
         DATE_FORMAT(currentdate,'%W'), 
         DATE_FORMAT(currentdate,'%M'), 
         'f', 
         CASE DAYOFWEEK(currentdate) WHEN 1 THEN 't' WHEN 7 then 't' ELSE 'f' END, 
         NULL); 
     SET currentdate = ADDDATE(currentdate,INTERVAL 1 DAY); 
    END WHILE; 
END 
// 
DELIMITER ; 

TRUNCATE TABLE time_dimension; 

CALL fill_date_dimension('2000-01-01','2018-01-01'); 

一旦创建了该日历表,您可以在下面写下查询,它将解决您的问题。

SELECT added_date,count(added_date) as result 
FROM time_dimension TD 
LEFT JOIN reports RP ON DATE(RP.added_date)=TD.DB_DATE 
WHERE added_date BETWEEN '2017-08-01' AND '2017-08-10' group by 
GROUP BY DATE(DB_DATE);