LISTAGG関数
それでは今回、最後の1問です。
問3
職種が「AD_VP」「IT_PROG」の従業員に対し、職種ごとに給与の高額な人から順にソートするレポートを作成する必要があります。なお、同じ職種の従業員は同じ行に表示する必要があります。目的の結果を得るためには、どの問合せを使用しますか。最も適切なものを選択しなさい。
-
a. SELECT job_id,LISTAGG(last_name,',') WITHIN GROUP ORDER BY (salary) AS last_name
FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
GROUP BY job_id; -
b. SELECT job_id,LISTAGG(last_name,',') WITHIN GROUP (ORDER BY salary) AS last_name
FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
GROUP BY job_id
ORDER BY salary; -
c. SELECT job_id,LISTAGG(last_name,';') WITHIN GROUP (ORDER BY salary) AS last_name
FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
GROUP BY job_id
ORDER BY job_id; -
d. SELECT job_id,LISTAGG(last_name,';' WITHIN GROUP ORDER BY salary) AS last_name
FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
GROUP BY job_id;
実行結果を確認しましょう。まず、選択肢aとdは、LISTAGG以下の構文(括弧の数と位置)が間違っているため、不正解です。
SQL> --選択肢a
SQL> SELECT job_id,LISTAGG(last_name,',') WITHIN GROUP ORDER BY (salary) AS last_name
2 FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
3 GROUP BY job_id;
SELECT job_id,LISTAGG(last_name,',') WITHIN GROUP ORDER BY (salary) AS last_name
*
行1でエラーが発生しました。:
ORA-00906: 左カッコがありません。
SQL> --選択肢d
SQL> SELECT job_id,LISTAGG(last_name,';' WITHIN GROUP ORDER BY salary) AS last_name
2 FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
3 GROUP BY job_id;
SELECT job_id,LISTAGG(last_name,';' WITHIN GROUP ORDER BY salary) AS last_name
*
行1でエラーが発生しました。:
ORA-00907: 右カッコがありません。
選択肢bは、ORDER BY句にGROUP BY句に記述していない列を使用しています。メジャー列の並べ替えは、SELECT文全体にかかるORDER BY句ではなく、LISTAGG関数の引数として指定しなければいけません。
SQL> --選択肢b
SQL> SELECT job_id,LISTAGG(last_name,',') WITHIN GROUP (ORDER BY salary) AS last_name
2 FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
3 GROUP BY job_id
4 ORDER BY salary;
ORDER BY salary
*
行4でエラーが発生しました。:
ORA-00979: GROUP BYの式ではありません。
選択肢cは正解です。選択肢bの説明でも触れましたが、メジャー列の並べ替えは、LISTAGG関数の引数として指定します。SELECT文末尾のORDER BYは、SELECT文全体に対して指定している行の並べ替えです。
SQL> --選択肢c
SQL> SELECT job_id,LISTAGG(last_name,';') WITHIN GROUP (ORDER BY salary) AS last_name
2 FROM employees WHERE job_id IN ('AD_VP','IT_PROG')
3 GROUP BY job_id
4 ORDER BY job_id;
JOB_ID LAST_NAME
---------- ----------------------------------------
AD_VP De Haan;Kochhar
IT_PROG Lorentz;Austin;Pataballa;Ernst;Hunold
次回は単一行関数とグループ関数が入り混じった関数における総合問題に挑戦してもらいましょう。

