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 行を取得することを目指していますorder_totalorder_total単品のご注文はもちろん31日に発送いたします。

これまでの私の試み:

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: 式がありません

この質問の解決策を使用しようとしましたが、私のシナリオにはあまり適していないと思います (これが私の group by 式の由来です)。

4

1 に答える 1

5

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 日前の午前 0 時から今日クエリを実行した時間までの注文が無視されます。また、列のエイリアスではなく、切り捨てられた日付を直接使用したorder byので、月末をまたいだときに順序が正しくなります。DD/MM/YYYY文字列値で並べ替えると、2013 年 1 月 7 日が 30/ より前になります。たとえば、2013 年 6 月。

クイックSQLフィドル

于 2013-07-31T10:32:09.297 に答える