助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26629
問題を開く
次の書式でデータを出力するにはどのSQL文を使用しますか。
正解
SELECT prod_category, LISTAGG(prod_name, ', ') WITHIN GROUP (ORDER BY prod_category) products
FROM new_products
GROUP BY prod_category;
解説
Oracle Database 11gリリース2から使用可能なLISTAGG関数は、複数行の列の値を連結して1行で表示できる関数です。
LISTAGG(連結して表示する列名 [, 'デリミタ'])
WITHIN GROUP(ORDER BY ソートする項目 [ASC | DESC])
設問では、PROD_CATEGORYごとのPROD_NAME列の一覧を「, 」で区切って表示しています。
以上より、
・SELECT prod_category, LISTAGG(prod_name, ', ') WITHIN GROUP (ORDER BY prod_category) products
FROM new_products
GROUP BY prod_category;
が正解となります。
その他の選択肢については次のとおりです。
・SELECT prod_category, LISTAGG(prod_name, ', ') products
FROM new_products
GROUP BY prod_category;
WITHIN GROUPキーワードがないためエラーとなります。
・SELECT prod_category, LISTAGG(prod_name, ', ') GROUP WITHIN (ORDER BY prod_category) products
FROM new_products
GROUP BY prod_category;
WITHIN GROUPの順番ではなく、GROUP WITHINと記述しているためエラーとなります。
・SELECT prod_category, LISTAGG(prod_name, ', ') products
FROM new_products
WITHIN GROUP (ORDER BY prod_category);
LISTAGGの直後にWITHIN GROUPキーワードを記述していないためエラーとなります。
LISTAGG(連結して表示する列名 [, 'デリミタ'])
WITHIN GROUP(ORDER BY ソートする項目 [ASC | DESC])
設問では、PROD_CATEGORYごとのPROD_NAME列の一覧を「, 」で区切って表示しています。
以上より、
・SELECT prod_category, LISTAGG(prod_name, ', ') WITHIN GROUP (ORDER BY prod_category) products
FROM new_products
GROUP BY prod_category;
が正解となります。
その他の選択肢については次のとおりです。
・SELECT prod_category, LISTAGG(prod_name, ', ') products
FROM new_products
GROUP BY prod_category;
WITHIN GROUPキーワードがないためエラーとなります。
・SELECT prod_category, LISTAGG(prod_name, ', ') GROUP WITHIN (ORDER BY prod_category) products
FROM new_products
GROUP BY prod_category;
WITHIN GROUPの順番ではなく、GROUP WITHINと記述しているためエラーとなります。
・SELECT prod_category, LISTAGG(prod_name, ', ') products
FROM new_products
WITHIN GROUP (ORDER BY prod_category);
LISTAGGの直後にWITHIN GROUPキーワードを記述していないためエラーとなります。
参考
Oracle Database 11gリリース2から使用可能なLISTAGG関数は、複数行の列の値を連結して1行で表示できる関数です。
LISTAGG(連結して表示する列名 [, 'デリミタ'])
WITHIN GROUP(ORDER BY ソートする項目 [ASC | DESC])
区切り文字のデリミタは省略可能です。省略すると列の値は区切り記号なしに連結して表示されます。
WITHIN GROUP(ORDER BY~)キーワードは省略できず、必ずこの書式で記述しなければなりません。
以下の例では、部署ごとの従業員名の一覧を給与の高い順に「:」で区切って表示しています。

LISTAGG(連結して表示する列名 [, 'デリミタ'])
WITHIN GROUP(ORDER BY ソートする項目 [ASC | DESC])
区切り文字のデリミタは省略可能です。省略すると列の値は区切り記号なしに連結して表示されます。
WITHIN GROUP(ORDER BY~)キーワードは省略できず、必ずこの書式で記述しなければなりません。
以下の例では、部署ごとの従業員名の一覧を給与の高い順に「:」で区切って表示しています。

SQLを表示
SELECT department_id, LISTAGG(employee_name, ':') WITHIN GROUP (ORDER BY salary DESC NULLS LAST) "従業員"
FROM employees
GROUP BY department_id;
FROM employees
GROUP BY department_id;
WITHIN GROUPの必要性
投稿日 2025/11/02
・SELECT prod_category, LISTAGG(prod_name, ', ') products
FROM new_products
GROUP BY prod_category;
WITHIN GROUPキーワードがないためエラーとなります。
こちらのSQLにWITHIN GROUPを付与する必要があるのでしょうか?
Oracleには自動で型変換を行ったりする特有のものがあるので、もしかしたらそういったものが作用しているのかと考えましたが、一度皆様に聞いてみたいと思います。
ご協力よろしくお願いします。
2025/11/03 10:35
参考に
Oracle Database 11gリリース2から使用可能なLISTAGG関数は、複数行の列の値を連結して1行で表示できる関数です。
(略)
WITHIN GROUP(ORDER BY~)キーワードは省略できず、必ずこの書式で記述しなければなりません。
の記載があるので
こちらのSQLにWITHIN GROUPを付与する必要があるのでしょうか?
必要がある、と言えるかと思うのですが、付与しなくても良いと思った理由を伺っても良いでしょうか?
コメント
この投稿に対して返信しませんか?
t tyanman
2025/11/13 20:00
SELECT文内でORDER BY は省略できるからじゃないですか? PostgreSQLに似たような関数がありますが、そちらは並び替えの機能はオプション(省略可)だった気がします。