Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
Php MySQL平均值(计数(*)-按周查询的订单?_Php_Mysql_Count_Average - Fatal编程技术网

Php MySQL平均值(计数(*)-按周查询的订单?

Php MySQL平均值(计数(*)-按周查询的订单?,php,mysql,count,average,Php,Mysql,Count,Average,这个问题一直困扰着我……我已经在网上搜索了一天多了,我尝试了很多东西 我想从我的数据库中获取一周中每天的平均订单数。我可以用COUNT很好地提取总数。但我就是不知道如何获得GROUP BY的平均订单数。我尝试过子查询…函数…所有功能…都不起作用…也许有人可以扔我一根骨头 这是我从下面开始的查询。我知道AVGCOUNT*不起作用,但我将保留它,因为它显示了我想要做的事情 SELECT AVG(COUNT(*)) AS avgorders, SUM(total) AS order

这个问题一直困扰着我……我已经在网上搜索了一天多了,我尝试了很多东西

我想从我的数据库中获取一周中每天的平均订单数。我可以用COUNT很好地提取总数。但我就是不知道如何获得GROUP BY的平均订单数。我尝试过子查询…函数…所有功能…都不起作用…也许有人可以扔我一根骨头

这是我从下面开始的查询。我知道AVGCOUNT*不起作用,但我将保留它,因为它显示了我想要做的事情

SELECT 
    AVG(COUNT(*)) AS avgorders, 
    SUM(total) AS ordertotal, 
    DAYNAME(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) AS day 
FROM data 
GROUP BY day 
ORDER BY DAYOFWEEK(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) ASC

你所问的对我来说没有意义…AVG是一个聚合函数,COUNT也是。上面的查询有什么问题,只使用:COUNT*作为avgorders

假设第1天有3行,第2天有2行,第3天有5行,第4天有9行……是否要返回一行结果,该结果告诉您:

avgorders   = (3 + 2 + 2 + 5 + 9) / 5 = 21 / 5 = 4.2
ordertotal  = (3 + 2 + 2 + 5 + 9)              = 21

我认为你不可能在一个查询中得到这个结果,最好使用服务器端语言(如PHP)对第一次聚合的结果进行第二轮聚合。

这样就可以了,假设order_time是date或datetime字段,每个人都会更喜欢这种方式。当然有一些近似值,因为最早的订单可能在周五,最新的订单可能在周一,所以一周中每天的订单数量并不相等,但为一周中的每一天创建单独的变量将是一件痛苦的事情。无论如何,我希望这对现在有所帮助

SET @total_weeks = (
    SELECT
        TIMESTAMPDIFF(
            WEEK,
            MIN(order_time),
            MAX(order_time)
        )
     FROM data
    );

SELECT
    DAYNAME(order_time) AS day_of_week,
    ( COUNT(*) / @total_weeks ) AS avgorders,
    COUNT(*) AS total_orders
FROM 
    data
GROUP BY
    DAYOFWEEK(order_time)

要获得平均值,您不需要每天的总计,您需要每天的多个总计

  Day    |  Count
__________________
 Monday        5
 Tuesday       4
 Monday        6
 Tuesday       3
 ...          ...
然后你可以对这些数字取平均值,即周一的5+6/2。 像这样的方法应该会奏效:

SELECT day_of_week, AVG(order_count) average_order FROM 
(
  SELECT DAYNAME(order_date) day_of_week, 
         DAYOFWEEK(order_date) day_num, 
         TO_DAYS(order_date) date,
         count(*) order_count
  FROM data 
  GROUP BY date
) temp
GROUP BY day_of_week 
ORDER BY day_num

更新:我原来是错的。按实际日期对内部选择进行分组,以获得正确的每日总计。例如,您需要分别获得10年2月1日星期一和10年2月8日星期一的订单数量。然后按一周中的某一天对这些总计进行平均。

我知道这很旧,但我正在搜索类似的解决方案,希望找到一些解决方案为了不做子查询,我提出了以下建议,希望能得到任何反馈

SELECT dayofweek(`timestamp`) as 'Day',count(`OrderID`)/count(DISTINCT day(`timestamp`)) as 'Average' FROM  `Data` GROUP BY dayofweek(`timestamp`)

我们的想法是将一周中某一天的总订单数除以周一或任何一天的总订单数。这不包括任何订单数为零的天数不会降低平均值。这可能会降低平均值,也可能不会降低平均值,这取决于应用程序。

Hmmm…也许我解释错了。我可以将总订单数如果订单是在星期一下的……但是我想要的是DB中所有订单在星期一下的订单的平均值。我可以得到星期一、星期二等的订单总数,但我需要平均值。如下所示:一周中每一天的订单总数195周一188周四180周二179周三是的,这正是我需要的……但that查询再次显示每天的总数。我将尝试重新计算。Edy,你是对的,我以前的数据是错误的。这应该是你要问的问题。这假设你每天至少有一个订单。如果没有,你的平均值将假设这一天不存在,而不是将其视为0,并且这些天可能会偏高。这仍然是一个有用的答案,但是t这是需要注意的。