変換関数の書式
早速ですが、1問目です。
問1
各年度ごとの入社人数を求めるためのSQLを作成しました。 正しい説明を選択しなさい。
SELECT TO_CHAR(hire_date,'yyyy'),COUNT(*) FROM employees GROUP BY TO_CHAR(hire_date,'rr');
- a. 正常に実行され、正しく出力される
- b. GROUP BY句でTO_CHAR関数は使用できないので、エラーが発生する
- c. 正常に実行されるが、正しくない出力が行われる
- d. SELECT句とGROUP BY句でTO_CHAR関数の戻す値が異なるので、エラーが発生する
実行例を見てみましょう。
SQL> SELECT TO_CHAR(hire_date,'yyyy'),COUNT(*) 2 FROM employees 3 GROUP BY TO_CHAR(hire_date,'rr'); SELECT TO_CHAR(hire_date,'yyyy'),COUNT(*) * 行1でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。
実行例から分かるようにエラーになるので、選択肢aとcは不正解であることが分かります。 では、エラーになる理由ですが、次のことを思い出してください。
復習ポイント1
グループ処理を行う(SQL文内でグループ関数を使う)場合、SELECT
句、HAVING
句、ORDER BY
句では、グループ関数またはGROUP BY
句で指定した列を記述する。
SELECT
句とGROUP BY
句のどちらも、TO_CHAR
関数の引数としてhire_date列を使用していますから、上記の復習ポイント1の内容を満たしているのでは?と思ったかもしれません。しかし、TO_CHAR
関数の第2引数はrr
とyyyy
で一致していませんね。
rr
はyyyy
と同様に西暦を表す書式です。 yy
と同様、西暦の下2桁を表しますが、表1に示す特徴があります。
指定された西暦の下2桁 | |||
---|---|---|---|
0~49 | 50~99 | ||
現在の 西暦の 下2桁 |
0~49 |
戻される西暦の上2桁は 今の100年 |
戻される西暦の上2桁は 1つ前の100年 |
50~99 |
戻される西暦の上2桁は 1つ先の100年 |
戻される西暦の上2桁は 今の100年 |
現在は西暦2016年、つまり西暦の下2桁は「0~49」なので、rr
書式での「20」は今の100年である現世紀(2000年代)の「2020年」を表します。 また、rr
書式での「99」は1つ前の100年である前世紀(1900年代)の「1999年」を表します。
変換関数の書式は全般に出題頻度が高いのですが、rr
書式もやはり出題されやすいので、表1の内容をしっかり頭に入れておきましょう。
復習ポイント2
rr
書式では、値の範囲によって西暦上2桁が決まる!
さて、問1の解説に戻りますが、GROUP BY
句にTO_CHAR
関数を含めた単一行関数が使用できないわけではありません(選択肢bは不正解)。本設問で大事なのは、SELECT
句に使用されている列は、GROUP BY
句に指定された列であるかどうかです。
引数が違えば関数が戻す値も異なりますから、GROUP BY
句に単一行関数が含まれる場合、引数も同じでなければいけません。したがって、問1の正解は選択肢dです。類似問題が出題された場合は、引数も確認した上で解答しましょう。