5

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

我想从我的数据库中获取一周中每一天的平均订单数。我可以用 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

4 回答 4

9

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

  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

更新:我最初是错的。按实际日期对内部 SELECT 进行分组以获得正确的每日总计。例如,您需要分别获取星期一 (2/1/10) 和星期一 (2/8/10) 发生的订单数量。然后按星期几平均这些总数。

于 2010-02-09T20:03:22.880 回答
1

我知道这很旧,但我正在寻找类似的解决方案,希望能找到其他人使用过的东西。为了不做子查询,我想出了以下内容,并希望得到任何反馈!

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

这个想法是将一周中给定日期的总订单除以“星期一”的总数或任何一天。这没有考虑到任何订单为零的日子都不会降低平均值。取决于应用程序,这可能需要也可能不需要。

于 2014-11-11T02:39:43.970 回答
1

这会做,假设order_timedatedatetime领域(每个人都会更快乐;))。当然有一些近似值,因为最早的订单可能在星期五,最新的订单在星期一,所以一周中每一天的数量不相等,但是为一周中的每一天创建单独的变量会很痛苦。无论如何,我希望它现在会有所帮助。

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)
于 2010-02-09T19:55:39.187 回答
0

你问的对我来说没有意义...... AVG 是一个聚合函数,COUNT 也是。上面的查询有什么问题,但只使用:COUNT(*) AS 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 这样的服务器端语言对第一次聚合的结果进行第二轮聚合。

于 2010-02-09T18:54:13.700 回答