2012-03-19 16 views
0

私はテーブルOrdersorder_dateorder_totalを持っています。 1か月に平均注文数を調べることは可能ですか?この場合オラクル:1か月あたりの平均はいくらですか?

=== 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 

答えて

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 - 2月-10のようなものを取得します。 FEB-10に変更することも可能ですか?ちょうど なし。

私は、この場合の「MON-YY」のマスクでTO_CHAR()を使用して提案していたが、これは彼がもはや正しく並べ替え、その列に、それは今の文字列ではなく、日付だったのでできたことを意味しました。次のようにこれを処理する1つの方法は、次のようになります。

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 
) 
+0

すごい!ありがとうございました! –

+0

'order_month'の列には、' 01-JAN-10'や '01-FEB-10'のようなものがあります。 FEB-10に変更することも可能ですか?ちょうどその日なし。 –

+1

はい、 'SELECT'列と' GROUP BY'の両方で 'TRUNC(order_date、 'MM')'ではなく 'TO_CHAR(order_date、 'MON-YY')'を使用してください。あなたが好きなキャラクターマスクを選んで、それと一緒に転がす。あなたのテーブルにたくさんのレコードがある場合、 'order_date'に関数インデックスを置くことは価値があるかもしれません。 –

1

はい、それは可能です。

あなたは、クエリを記述AVGし、最終的にGROUP BY月あなたは、その月の各日付を軽減したいと思う

+0

月にグループ分けする方法がわかりました:) – 9000

1

エフゲニー@

select trunc(order_date, 'MONTH') as start_of_month, avg(order_total) 
from orders 
group by 1; 

(いいえ、私はそれをテストしていない。)

+0

私はそれがOracleのすべての味で機能するとは思わない - 私は10gでそれを試してみた。 –

0

、デビッド

select trunc(to_date('5-FEB-10','dd-MON-YY'),'MON') from dual; 
ような何か

はFEBではなく01-02-2010を返します。

代わりに私がテストした

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; 

を使用しています。注文は完全に同様に働いています。

+0

日付が何年にもわたって広がっている場合、 'ORDER BY'はここでは機能しません。要するに、例えば数ヶ月間は機能しません。 CHAR値でソートする場合、 'NOV-11'の前に 'DEC-11'が来ます。私はちょうど私のDBのテーブルでこれを試し、この順序で結果を得ました: '' DEC-02 '、' JUL-10 '、' SEP-00'' –

+0

私を訂正してくれてありがとう。 – cyborg007

関連する問題