甲骨文:每月平均多少钱?

时间:2012-03-19 18:52:15

标签: sql oracle

我有Ordersorder_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

4 个答案:

答案 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也很完美。