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