助け合いフォーラム

Oracle DB

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キーワードを記述していないためエラーとなります。

参考

Oracle Database 11gリリース2から使用可能なLISTAGG関数は、複数行の列の値を連結して1行で表示できる関数です。

 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;
上に戻る

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に似たような関数がありますが、そちらは並び替えの機能はオプション(省略可)だった気がします。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?