2013-07-31 78 views
1

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: missing expression

我曾嘗試使用從this question解決,但我不認爲它很適合我的情況下(這是我的表達組來自的地方)。

+1

爲什麼在'select'列表中有'order_id';你期望在那裏展示總計10個訂單的單行?您可能需要刪除它,或者用集合函數替換它。 –

+0

是的我同意它不應該在那裏,刪除它謝謝。現在錯誤改成了'ORA-00936:缺少的表達式'。 – RandomCoder

回答

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字符串值排序會在01/07/2013之前例如,2013年6月30日。

快速SQL Fiddle

+0

這工作得很好,謝謝! – RandomCoder