Oracle组按日期排序并总计总和

时间:2013-07-31 10:20:35

标签: sql oracle group-by

我的Orders表格如下:

order_id     (number)
order_total  (number)
created_date (timestamp)
status       (varchar2)

我的目标是获取一组行,其中每行代表该日期的所有订单,因此我尝试按日期对订单进行分组并获得order_total的总和。我也只是通过选择过去30天的订单来限制结果。

为了澄清,例如,如果在过去30天内有30个订单全部在唯一的日子里,那么我将在结果中获得30行。另一个例子:如果7月30日有10个订单,7月31日只有1个订单,那么我的目标是在结果集中获得2行,第一行中所有10个订单的order_total总和,第二行当然会在31日有单个订单的order_total

到目前为止我的尝试:

select
  sum(order_total) total_amount,
  to_char(created_date, 'DD/MM/YYYY') grouped_date
from
  orders
where
  status = 'Complete' and
  created_date >= (sysdate-30)
group by
  to_char(created_date, 'DD'), to_char(created_date, 'MM'), to_char(created_date, 'YYYY')
order by
  created_date asc

这会出错:

  

ORA-00936:缺少表达

我尝试使用this question中的解决方案,但我认为它不适合我的场景(这是我的表达式来自的地方)。

1 个答案:

答案 0 :(得分:3)

假设order_id不应该在那里,并且created_date有一个时间组件(看起来可能是timestamp),您需要截断日期以删除时间进行聚合:

select
  sum(order_total) as total_amount,
  to_char(trunc(created_date), 'DD/MM/YYYY') as grouped_date
from
  orders
where
  status = 'Complete' and
  created_date >= trunc(sysdate-30)
group by
  trunc(created_date)
order by
  trunc(created_date) asc

我还将trunc应用于where子句,否则它将在30天前的午夜之间以及今天运行查询的任何时间忽略任何订单。我直接在order by中使用截断日期,而不是列别名,因此当您跨越月末时顺序正确 - 按DD/MM/YYYY字符串值排序例如,将于2013年6月30日之前提交01/07/2013。

快速SQL Fiddle