Mysql 计算每日平均值(或者:一个日期范围内有多少个星期一?)
我的MySQL表有以下列:datetime、price\u paid。 我试图计算一周中两个日期之间每天的平均销售额。 这意味着我需要选择startDate和endDate之间的销售总额,按工作日分组,然后除以该范围内每个工作日发生的次数 我得到了第一部分:Mysql 计算每日平均值(或者:一个日期范围内有多少个星期一?),mysql,sql,datetime,Mysql,Sql,Datetime,我的MySQL表有以下列:datetime、price\u paid。 我试图计算一周中两个日期之间每天的平均销售额。 这意味着我需要选择startDate和endDate之间的销售总额,按工作日分组,然后除以该范围内每个工作日发生的次数 我得到了第一部分: SELECT DATE_FORMAT(datetime, '%a') AS field1, round(SUM(price_paid)/ THEVALUEIMLOOKINGFOR ) AS field2 FROM Bills WHER
SELECT DATE_FORMAT(datetime, '%a') AS field1,
round(SUM(price_paid)/ THEVALUEIMLOOKINGFOR ) AS field2
FROM Bills
WHERE date(datetime) BETWEEN '2012-01-02' AND '2012-01-09'
GROUP BY weekday(datetime)
我没有的是缺少的值:我应该除以每天出现在这个范围内的次数。我尝试了几种解决办法,但都没有用
有人能帮我完成SQL语句吗
谢谢你的时间 也许我太简单了,但是既然你已经按工作日分组了,那么你不只是计算(*)每个工作日在该范围内的给定工作日数吗 因此:
编辑以避免在同一天多次计算过多(谢谢DRapp)这里有一个名为MakeDateList的存储函数:
DELIMITER $$
DROP FUNCTION IF EXISTS `junk`.`MakeDateList` $$
CREATE FUNCTION `junk`.`MakeDateList`
(
BeginDate DATE,
EndDate DATE,
InclusionList VARCHAR(20)
)
RETURNS VARCHAR(4096)
DETERMINISTIC
BEGIN
DECLARE RunningDate DATE;
DECLARE rv VARCHAR(4096);
DECLARE comma CHAR(1);
DECLARE IncList,DOWValue VARCHAR(20);
DECLARE OK_To_Add INT;
SET IncList = CONCAT(',',InclusionList,',');
SET comma = '';
SET rv = '';
SET RunningDate = BeginDate;
WHILE RunningDate <= EndDate DO
SET OK_To_Add = 0;
SET DOWValue = CONCAT(',',DAYOFWEEK(RunningDate),',');
IF LOCATE(DOWValue,IncList) > 0 THEN
SET OK_To_Add = 1;
END IF;
IF OK_To_Add = 1 THEN
SET rv = CONCAT(rv,comma,RunningDate);
END IF;
SET comma = ',';
SET RunningDate = RunningDate + INTERVAL 1 DAY;
END WHILE;
RETURN rv;
END $$
DELIMITER ;
因此,要获得周一,请制作包含列表2
示例:调用MakeDateList('2011-10-01'、'2011-10-01'、'2')应该为您提供整个2011年10月的周一时间因为您需要平均值的总和,所以您需要使用子查询来计算每天的平均值,然后计算平均值的总和 我已经修改了查询以包含一个外部查询,该查询返回平均值的总和。然而,现在字段1将不再有意义,因为它可以是任何日期,这取决于您使用的订购选项
SELECT field1, SUM (field2) FROM (
SELECT DATE_FORMAT(datetime, '%a') AS field1,
AVG(price_paid) AS field2
FROM Bills
WHERE date(datetime) BETWEEN '2012-01-02' AND '2012-01-09'
GROUP BY weekday(datetime)
)
我知道这很旧,但“似乎有用”。还不够好。
事实上,如果有一天交易量为零,它将低估周一的数量
有一个计算日期范围内每周天数的公式。你需要从一周中已知的一天开始。“1970-01-05”是星期一
以下是您可以使用的函数:
create function CountDaysOfWeek(
DateFrom DATETIME,
DateTo DATETIME,
DayOfWeek int
)
RETURNS int
return FLOOR(DATEDIFF(DateTo,'1970-01-03' + INTERVAL DayOfWeek DAY)/7) -
FLOOR(DATEDIFF(DateFrom,'1970-01-03' + INTERVAL (DayOfWeek+1) DAY)/7);
那么,你最终是否希望看到类似每日平均值的东西:周一、周二、周三等等。。。在日期范围内?如果是这样,一些范围可能只有2个星期三对3个星期一和星期二(或其他类似)…正确-我需要一个每日平均值。我希望下面的解决方案能考虑到这一点,我认为你们非常接近。。。然而,如果他们在同一天有多张账单,你会过度计算除数。在格式化的yyyy-mm-dd上计数(不同)将有助于确保…因此
计数(不同(日期(日期时间))
感谢您的回答。但有一个问题:这是否包括日期范围为8天的情况(例如,有2个星期一)因此,您需要将buy 2 Mondays除以?是否仍然需要使用Distinct?@TravelingTechGuy,这应该是正确的。如果8天,跨越两个星期一的总数将除以2…但是,Tue Sun将只除以每个实例1…使用一些示例数据运行,您应该是好的。尝试了这个方法。这将返回平均值每天ge,不是平均值的总和。谢谢
SELECT field1, SUM (field2) FROM (
SELECT DATE_FORMAT(datetime, '%a') AS field1,
AVG(price_paid) AS field2
FROM Bills
WHERE date(datetime) BETWEEN '2012-01-02' AND '2012-01-09'
GROUP BY weekday(datetime)
)
create function CountDaysOfWeek(
DateFrom DATETIME,
DateTo DATETIME,
DayOfWeek int
)
RETURNS int
return FLOOR(DATEDIFF(DateTo,'1970-01-03' + INTERVAL DayOfWeek DAY)/7) -
FLOOR(DATEDIFF(DateFrom,'1970-01-03' + INTERVAL (DayOfWeek+1) DAY)/7);