Mysql 我每天的总收入

Mysql 我每天的总收入,mysql,sql,Mysql,Sql,这与此链接上的一篇帖子有关: 我想计算每天的总计数,但不仅是有人进入的日子,还有没有人进入的日子 SELECT DATE(datetime) as DATE, SUM(`count`) totalCOunt FROM tableName GROUP BY DATE(datetime) 上面的代码只返回有条目的日期 假设我想得到2016年4月至2017年2月期间每天的总计数,我该如何做?谢谢例如: 2012-12-25 25 2012-12-26 NULL -

这与此链接上的一篇帖子有关:

我想计算每天的总计数,但不仅是有人进入的日子,还有没有人进入的日子

SELECT    DATE(datetime) as DATE, SUM(`count`) totalCOunt
FROM      tableName
GROUP BY  DATE(datetime)
上面的代码只返回有条目的日期

假设我想得到2016年4月至2017年2月期间每天的总计数,我该如何做?谢谢例如:

2012-12-25     25
2012-12-26     NULL --> because there is no entry

如下面的代码所示。您可以创建日历表。它根据我们的要求为我们提供准确的日历。 在那个日历表中做一个条目

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');

希望这会有所帮助。

请尝试以下方法

DROP PROCEDURE IF EXISTS SumCountAllDays;

DELIMITER //
    CREATE PROCEDURE SumCountAllDays( startDate DATE,
                                      endDate DATE )
    BEGIN
        DECLARE daysCount INT;
        DECLARE daysIndex INT DEFAULT 0;

        SELECT DATEDIFF( endDate,
                         startDate )
        INTO daysCount;

        SET @selectStatementString := CONCAT( "SELECT allDays.intervalDate AS `Date`,",
                                              "       COALESCE( SUM( `count` ), 0 ) AS totalCount ",
                                              "FROM ( SELECT '",
                                              startDate,
                                              "' AS intervalDate" );

        daysLister : LOOP
            SET daysIndex = daysIndex + 1;
            IF daysIndex <= daysCount THEN
                SET @selectStatementString := CONCAT( @selectStatementString,
                                                      " UNION SELECT '",
                                                      DATE_ADD( startDate,
                                                                INTERVAL daysIndex DAY ),
                                                      "'" );
                ITERATE daysLister;
            END IF;
            LEAVE daysLister;
        END LOOP daysLister;

        SET @selectStatementString := CONCAT( @selectStatementString,
                                              " ) AS allDays ",
                                              "LEFT JOIN tableName ON allDays.intervalDate = DATE( `datetime` ) ",
                                              "GROUP BY allDays.intervalDate;" );

        PREPARE selectStatement FROM @selectStatementString;
        EXECUTE selectStatement;
        DEALLOCATE PREPARE selectStatement;
   END //
DELIMITER ;
我根据使用以下脚本创建的测试数据库测试了我的语句

CREATE TABLE tableName
(
    `datetime`   DATETIME,
    `count`      INT
);
INSERT INTO tableName ( `datetime`,
                        `count` )
VALUES ( '2012-12-27 09:22:15', 5 ),
       ( '2012-12-27 18:20:15', 4 ),
       ( '2012-12-27 23:19:15', 3 ),
       ( '2012-12-26 13:45:15', 8 ),
       ( '2012-12-26 04:56:15', 7 ),
       ( '2012-12-25 01:50:15', 2 ),
       ( '2012-12-25 12:02:15', 1 );
我使用以下语句调用了该过程

SELECT allDays.intervalDate AS `Date`,
       COUNT( `count` ) AS totalCount
FROM ( SELECT '2012-02-13' AS intervalDate
       UNION
       SELECT '2012-02-14'
       UNION
       SELECT '2012-02-15' ) AS allDays
LEFT JOIN tableName ON allDays.intervalDate = DATE( `datetime` )
GROUP BY allDays.intervalDate;
CALL SumCountAllDays( '2012-12-01',
                      '2012-12-31' );

如果您有任何问题或意见,请随时发表相应的意见。

您不能选择没有的内容。也许有一些黑客解决方案可以加入生成的列表?但可能不是。我说你需要数据库中所有日期的列表。使用日历表。你可以在谷歌上搜索,你会发现很多东西。所以你想在表中找到从最小日期到最大日期的计数总和。是吗?@Avi说得对。每天计数的总和。即使当天没有盘点/记录。我想蒂姆·比格莱森回答了这个问题。我必须了解如何使用它,并加入表中考虑处理应用程序代码中的数据显示问题。
CREATE TABLE tableName
(
    `datetime`   DATETIME,
    `count`      INT
);
INSERT INTO tableName ( `datetime`,
                        `count` )
VALUES ( '2012-12-27 09:22:15', 5 ),
       ( '2012-12-27 18:20:15', 4 ),
       ( '2012-12-27 23:19:15', 3 ),
       ( '2012-12-26 13:45:15', 8 ),
       ( '2012-12-26 04:56:15', 7 ),
       ( '2012-12-25 01:50:15', 2 ),
       ( '2012-12-25 12:02:15', 1 );
CALL SumCountAllDays( '2012-12-01',
                      '2012-12-31' );