我有Orders
和order_date
的表格order_total
。是否有可能找出每月平均订购量是多少?
=== ORDER_DATE === ORDER_TOTAL
--- 7-JAN-10 --- 5271
--- 12-JAN-10 --- 3646
--- 15-JAN-10 --- 310
--- 5-FEB-10 --- 71173
--- 12-FEB-10 --- 45175
--- 25-FEB-10 --- 126
在这种情况下,它将是:
JAN - 3075.66667 // calculation: (5271 + 3646 + 310) / 3
FEB - 38824.6667 // calculation: (71173 + 45175 + 126) / 3
答案 0 :(得分:6)
您希望将每个日期减少到其月份。以下TRUNC()
功能将返回每个日期的当月第一天。 AVG()是一个聚合函数,因此您需要GROUP BY
月份。
SELECT TRUNC(order_date, 'MM') AS order_month, AVG(order_total) AS order_avg
FROM orders
GROUP BY TRUNC(order_date, 'MM')
使用分析/窗口函数实现此目的的另一种方法(这样您可以返回所有订单数据以及每月的平均值)如下:
SELECT order_date, order_total, AVG(order_total) OVER (PARTITION BY TRUNC(order_date, 'MM'))
FROM orders
OP询问以下内容:
在订单order_month列中,我得到类似01-JAN-10或 01-FEB-10。是否有可能将其改为FEB-10?没有 那一天。
在这种情况下,我曾建议使用带有“MON-YY”掩码的TO_CHAR()
但这意味着他无法再对该列进行正确排序,因为它现在是一个字符串而不是日期。处理此问题的一种方法如下:
SELECT TO_CHAR(order_month, 'MON-YY'), order_avg
FROM (
SELECT TRUNC(order_date, 'MM') AS order_month, AVG(order_total) AS order_avg
FROM orders
GROUP BY TRUNC(order_date, 'MM')
ORDER BY order_month
)
答案 1 :(得分:1)
是的,这是可能的。
您撰写查询,使用AVG
,最后使用GROUP BY
月份
答案 2 :(得分:1)
像
这样的东西select trunc(order_date, 'MONTH') as start_of_month, avg(order_total)
from orders
group by 1;
(不,我没有测试过。)
答案 3 :(得分:0)
@ Evgeni,David
select trunc( to_date('5-FEB-10','dd-MON-YY'),'MON') from dual;
返回01-02-2010而不是FEB。
改为使用
select to_char(order_date,'MON-YY') as order_month, avg(order_total)
from orders group by to_char(order_date,'MON-YY')
order by order_month;
由我测试。 Order by也很完美。