我的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中的解决方案,但我认为它不适合我的场景(这是我的表达式来自的地方)。
答案 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。