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
次回は単一行関数とグループ関数が入り混じった関数における総合問題に挑戦してもらいましょう。
この記事は参考になりましたか?
- めざせオラクルマスターホルダー! Oracle DB 12c SQL基礎 弱点克服スクール連載記事一覧
- この記事の著者
-
林 優子(ハヤシ ユウコ)
日本オラクル株式会社の教育ビジネスのスタートアップを全面的に支援し、バージョン5の頃からOracleに携わるベテラン講師として知る人も多い。Oracle認定講師を表彰するExcellent Instructorを連続受賞。1ランク上のITスペシャリスト育成を目標に、データベース分野にとどまらず「プレゼンテーション」、「ロジカルシンキング」などのトレーニングも手がけている。著書に『オラクルマスター教科書』シリーズ(翔泳社)、『プロとしてのデータモデリング入門』(SBクリエイティブ)など。その他、雑誌執筆、著書・メディア出演も多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

