Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算每日平均值(或者:一个日期范围内有多少个星期一?)_Mysql_Sql_Datetime - Fatal编程技术网

Mysql 计算每日平均值(或者:一个日期范围内有多少个星期一?)

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

我的MySQL表有以下列:datetime、price\u paid。 我试图计算一周中两个日期之间每天的平均销售额。 这意味着我需要选择startDate和endDate之间的销售总额,按工作日分组,然后除以该范围内每个工作日发生的次数

我得到了第一部分:

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