次のようなユーザテーブルから更新日時(登録日)ごとのユーザ数を取得したい場面があるとする。

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句で参照できるらしい。