MySQL AVG(COUNT(*) - 订单按星期查询?

时间:2010-02-09 18:34:30

标签: php mysql count average

这个问题令我感到困惑......我已经搜索了一天的网络工作,我尝试了很多东西。

我希望从我的数据库中获取每周每天的平均订单数量。我可以用COUNT来计算总数#就好了。但我无法弄清楚如何在GROUP BY上获得COUNT的AVG。我已经尝试了子查询...功能......一切......没有任何作用......也许有人可以给我一个骨头。

以下是我在下面开始的查询。我知道AVG(COUNT(*))不起作用,但我会留下它,因为它显示了我想做的事情。

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

4 个答案:

答案 0 :(得分:9)

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

  Day    |  Count
__________________
 Monday        5
 Tuesday       4
 Monday        6
 Tuesday       3
 ...          ...

然后你可以平均那些数字。星期一I.e(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

更新:我本来是错的。将内部SELECT按实际日期分组以获得正确的每日总计。例如,您需要分别在星期一(2/1/10)和星期一(2/8/10)获得多少订单。然后将这些总数按星期几计算。

答案 1 :(得分:1)

这样做,假设 order_time datedatetime字段(每个人都会这样做;))。当然有一些近似值,因为最老的订单可以在周五和周一的最新订单,因此每周的每一天的数量不相等,但是为每周的每一天创建单独的变量将是痛苦的屁股。无论如何,我希望它现在会有所帮助。

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)

答案 2 :(得分:1)

我知道这已经过时了,但我正在寻找一种类似的解决方案,希望找到别人用过的东西。为了不做一个子查询,我提出了下面的内容,并希望任何反馈!

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

这个想法是将一周中某一天的总订单除以“星期一”的总数或任何一天。这没有考虑到的是零订单的任何日子都不会降低平均值。根据申请,这可能是也可能不是。

答案 3 :(得分:0)

你所问的对我来说没有意义...... AVG是一个聚合函数,因此是COUNT。上面的查询有什么问题,但只使用:COUNT(*)AS avgorders?

假设你说day1有3行,day2有2行,day3有5行,day4有9行...你想要回到单行结果告诉你:

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

我不认为你可以在一个查询中得到它,并且你最好在服务器端语言(如第一次聚合的结果上运行PHP)中进行第二轮聚合。