这个问题令我感到困惑......我已经搜索了一天的网络工作,我尝试了很多东西。
我希望从我的数据库中获取每周每天的平均订单数量。我可以用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
答案 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
是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)
答案 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)中进行第二轮聚合。