次のようなユーザテーブルから更新日時(登録日)ごとのユーザ数を取得したい場面があるとする。
select * from user_table;
USER_ID UPDATE_DATE
_________ _______________________________
a 01-SEP-22 07.40.30.000000000 PM
b 31-OCT-22 04.50.30.000000000 PM
c 31-OCT-22 06.20.30.000000000 PM
d 31-OCT-22 09.30.30.000000000 PM
e 01-NOV-22 04.10.30.000000000 PM
登録日でグルーピングする必要があるため、to_char関数を使って日付を文字列(YYYY/MM/DD)に変換する。
また、カラムの別名をregister_dateとして、group by で参照するカラム名に指定した。
select count(*) as count, to_char(update_date, 'YYYY/MM/DD') as register_date from table group by register_date;
Error at Command Line : 1 Column : 163
Error report -
SQL Error: ORA-00904: "REGISTER_DATE": invalid identifier
00904. 00000 - "%s: invalid identifier"
このSQLを実行すると、ORA-00904
のエラーが発生する。
解決方法
ORA-00904は、無効あるいは存在しない列名を指定した際に発生する。
今回のケースだと、group by register_date
の部分がエラーとなる。
Oracle Databaseでは、SELECT句で定義した別名はGROUP BY句で参照することができない。
そのため、次のように記載する必要がある。
select count(*) as count, to_char(update_date, 'YYYY/MM/DD') as register_date from table group by to_char(update_date, 'YYYY/MM/DD') order by update_date desc;
COUNT REGISTER_DATE
________ _______________
1 2022/09/01
3 2022/10/31
1 2022/11/01
to_char(update_date, 'YYYY/MM/DD')
の指定が冗長となるがDBMSの仕様上仕方がない。
ちなみに、MySQLではSELECT句で付けた別名をGROUP BY句やORDER BY句で参照できるらしい。