web-dev-qa-db-ja.com

SQL Group By-月/年あたりのレコード数、挿入時のエラー-有効な月ではありません

私はこのサンプルデータを持っています:

Country | Members   | Joined
USA     | 250       | 1/1/2012
USA     | 100       | 1/8/2012
Russia  | 75        | 1/20/2012
USA     | 150       | 2/10/2012

このデータをクエリするとき、特定の月のすべてのレコードを集計したいと思います。クエリの結果は次のようになります。

Country | Members   | Joined
USA     | 350       | 1/2012
Russia  | 75        | 1/2012
USA     | 150       | 2/2012

十分に単純な選択として:

select country, count(*) as members , to_char(trunc(joined), 'MM-YYYY')
from table
group by country, to_char(trunc(joined), 'MM-YYYY')

このクエリでは、必要な形式のデータが得られますが、新しいピボットテーブルにデータを挿入しようとすると、selectステートメントのto_char()がDATETIME列(エラー:ORA-01843-有効な月ではありません)

Selectのto_char()をto_date()に変更しても機能しません(同じエラー、ORA-01843-有効な月ではありません)。

select country, count(*) as members, to_date(trunc(joined), 'MM-YYYY')
from table
group by country, to_date(trunc(joined), 'MM-YYYY')

このクエリを変更して、 "JOINED"列の型がDATETIMEである新しいテーブルに結果を挿入できるようにする方法に関する提案はありますか?

ヒント/提案/コメントを事前に感謝します!

11
Pat Grady

to_date('01/'||trunc(joined), 'DD/MM/YYYY')のようなことができます。これにより、最初に有効な日付になります。月の最初の日を使用するか最後の日を使用するかを決定するだけです(最後の日はより複雑です)。

別のオプションは、EXTRACT関数を使用することです。

 select country, count(*) as members, EXTRACT(MONTH FROM joined) as mn, EXTRACT(YEAR FROM JOINED) as yr,MIN(JOINED) as dt
from table
group by country, EXTRACT(MONTH FROM joined), EXTRACT(YEAR FROM JOINED)

それから、dt列を選択して挿入するだけです

17
jle

trunc関数を使用して、日付を月の最初に切り捨てる必要があります。これにより、日付から文字列への変換が不要になり、文字列を日付に戻す必要がなくなります。

select country, 
       count(*) as members , 
       trunc(joined, 'MM')
  from table
 group by country,
          trunc(joined, 'MM')
9
Justin Cave