質問: OracleでSQL文の練習をしていますが、 タイトルに書いた文章が表示されます。 内容は以下です。 SELECT TRUNC(MONTHS_BETWEEN('2014-06-13',birth)/12,0) AS AGE, COUNT(id) AS player_count FROM players GROUP BY AGE 「TECH Pjin」というサイトのSQL練習問題の問19をやっており、 回答を参考に上記のコードを入力しましたが、タイトルのように 「ORA-00904:"AGE":無効な識別子です。」のエラーが出ます。 (回答はMySQLですが、いま使える環境がOracleなのでTRUNC()関数を利用しています) エラーが出る原因がTRUNC関数を利用しているためなのか、それ以外の原因があるのかがいくら調べてもわからなかったため、こちらの質問にあげさせていただきました。 https://tech.pjin.jp/blog/2016/08/26/sql%e7%b7%b4%e7%bf%92%e5%95%8f%e9%a1%8c-%e5%95%8f19/ わかる方がいらっしゃれば、ご回答お願いいたしますm(__)m 情報が不足しておりましたら追記いたしますので、その場合はコメント頂戴できればと思います。
回答: `GROUP BY AGE`がエラーです。 本来、selectとgroup byの実行順序はありません(どちらかというとgroup byの方が先) ですので、selectで付けたエイリアスはgroup byにとっては預かり知らぬところです。 MySqlはselectのエイリアスを参照してくれる仕様なのでエラーにはなりません。 oracleなら以下の様な記述になります。 ``` SELECT TRUNC(MONTHS_BETWEEN('2014-06-13',birth)/12,0) AS AGE, COUNT(id) AS player_count FROM players GROUP BY TRUNC(MONTHS_BETWEEN('2014-06-13',birth)/12,0) ```