「AP過去問 令和6年度春期 午前 問26」の版間の差分
編集の要約なし |
編集の要約なし |
||
(同じ利用者による、間の15版が非表示) | |||
1行目: | 1行目: | ||
<freescript></script> | |||
<style> | |||
.table-container { | |||
display: inline-block; | |||
text-align: left; | |||
margin: 20px; | |||
} | |||
.table-header { | |||
display: flex; | |||
justify-content: space-between; | |||
margin-bottom: 5px; | |||
} | |||
</style> | |||
<script></freescript> | |||
[[AP過去問 令和6年度春期 午前#問題|AP過去問 令和6年度春期 午前 問題]]に戻る | [[AP過去問 令和6年度春期 午前#問題|AP過去問 令和6年度春期 午前 問題]]に戻る | ||
9行目: | 24行目: | ||
=='''問26(問題文)'''== | =='''問26(問題文)'''== | ||
"部品"表及び"在庫"表に対し、SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。 | "部品"表及び"在庫"表に対し、SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。 | ||
<div><div class="table-container"><div class="table-header"><span class="table-title">部品</span><span class="table-unit"></span></div> | |||
<table border="2" style="border-collapse: collapse;border-style: solid"> | |||
<tr> | |||
<td align="center" style="border: 2px solid; width: 5em; border-bottom: double;">部品</td> | |||
<td align="center" style="border: 2px solid; width: 5em; border-bottom: double;">発注点</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P01</td> | |||
<td align="center" style="border: 2px solid;">100</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P02</td> | |||
<td align="center" style="border: 2px solid;">150</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P03</td> | |||
<td align="center" style="border: 2px solid;">100</td> | |||
</tr> | |||
</table> | |||
</div> | |||
<div class="table-container"><div class="table-header"><span class="table-title">在庫</span><span class="table-unit"></span></div> | |||
<table border="2" style="border-collapse: collapse;border-style: solid"> | |||
<tr> | |||
<td align="center" style="border: 2px solid; width: 5em; border-bottom: double;">部品ID</td> | |||
<td align="center" style="border: 2px solid; width: 5em; border-bottom: double;">倉庫ID</td> | |||
<td align="center" style="border: 2px solid; width: 5em; border-bottom: double;">在庫数</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P01</td> | |||
<td align="center" style="border: 2px solid;">W01</td> | |||
<td align="center" style="border: 2px solid;">90</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P01</td> | |||
<td align="center" style="border: 2px solid;">W02</td> | |||
<td align="center" style="border: 2px solid;">90</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 2px solid;">P02</td> | |||
<td align="center" style="border: 2px solid;">W01</td> | |||
<td align="center" style="border: 2px solid;">150</td> | |||
</tr> | |||
</table> | |||
</div> | |||
<div class="table-container"><div class="table-header"><span class="table-title">[結果]</span><span class="table-unit"></span></div> | |||
<table border="0" style="border-collapse: collapse;border-style: solid"> | |||
<tr> | |||
<td align="center" style="border: none; border-bottom: 2px dashed; width: 5em;">部品ID</td> | |||
<td align="center" style="border: none; border-bottom: 2px dashed; width: 5em;">発注要否</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 0px solid;">P01</td> | |||
<td align="center" style="border: 0px solid;">不要</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 0px solid;">P02</td> | |||
<td align="center" style="border: 0px solid;">不要</td> | |||
</tr> | |||
<tr> | |||
<td align="center" style="border: 0px solid;">P03</td> | |||
<td align="center" style="border: 0px solid;">必要</td> | |||
</tr> | |||
</table> | |||
</div> | |||
</div> | |||
〔SQL文〕 | 〔SQL文〕 | ||
14行目: | 97行目: | ||
SELECT 部品.部品ID AS 部品ID、 | SELECT 部品.部品ID AS 部品ID、 | ||
CASE WHEN 部品.発注点 > | CASE WHEN 部品.発注点 > <span style="display: inline-block; border: 2px solid; padding-left: 20px; padding-right: 20px;">a</span> | ||
THEN N'必要' ELSE N'不要' END AS 発注要否 | THEN N'必要' ELSE N'不要' END AS 発注要否 | ||
FROM 部品 LEFT OUTER JOIN 在庫 | FROM 部品 LEFT OUTER JOIN 在庫 | ||
ON 部品.部品ID = 在庫.部品ID | ON 部品.部品ID = 在庫.部品ID | ||
GROUP BY 部品.部品ID、部品.発注点 | GROUP BY 部品.部品ID、部品.発注点 | ||
36行目: | 119行目: | ||
=='''回答・解説'''== | =='''回答・解説'''== | ||
SELECT * FROM 部品 LEFT OUTER JOIN 在庫 | |||
:ON 部品.部品ID = 在庫.部品ID | |||
のSQL実行結果は以下のようになります。外部結合しますが、結合先がない部品P03も外部結合によってNULL値として取り込まれます。 | |||
<yjavascript></script> | |||
<style> | |||
.chatgpt_style { border-collapse: separate; border-spacing: 0; border-top: solid 1px lightgray; border-left: solid 1px lightgray; border-top-left-radius: 0.8rem; border-top-right-radius: 0.8rem; line-height: 1;} | |||
.chatgpt_style th, .chatgpt_style td { border-bottom: solid 1px lightgray; border-right: solid 1px lightgray; padding: 8px; text-align: left;} | |||
.chatgpt_style thead tr:first-child th:first-child { border-top-left-radius: 0.8rem;} | |||
.chatgpt_style thead tr:first-child th:last-child { border-top-right-radius: 0.8rem;} | |||
.chatgpt_style th { background-color: #f4f4f4; font-weight: bold; } | |||
.chatgpt_style tr:nth-child(even) { background-color: #f9f9f9; } | |||
.chatgpt_style tr:hover { background-color: #f1f1f1; } | |||
</style> | |||
<table class="chatgpt_style"><thead> | |||
<tr><th>部品ID</th><th>発注点</th><th>部品ID(在庫)</th><th>倉庫ID</th><th>在庫数</th></tr></thead><tbody> | |||
<tr><td>P01</td><td>100</td><td>P01</td><td>W01</td><td>90</td></tr> | |||
<tr><td>P01</td><td>100</td><td>P01</td><td>W02</td><td>90</td></tr> | |||
<tr><td>P02</td><td>150</td><td>P02</td><td>W01</td><td>150</td></tr> | |||
<tr><td>P03</td><td>100</td><td>NULL</td><td>NULL</td><td>NULL</td></tr></tbody> | |||
</table> | |||
<script></yjavascript> | |||
この問題のSQLはどうやら発注点により複数の倉庫にある在庫の総数が少ない場合には発注要否に必要だと判定したいのだなと意図のわかりやすい問題のSQLになっているようです。この意図に気付けない場合は問題を解くのに迷宮入りしてしまいます。 | |||
CASE WHEN ~条件~ THEN ~成立時~ ELSE ~非成立時~ 句はSELECTで表示したい行についての処理にIF文のようなものを適用しようとする動きになります。 | |||
GROUP BY句で部品、発注点毎でグループ化するので、異なる倉庫についてはまとめるようにしていることも、伺えます。 | |||
あとは選択肢のCOALESCE句ですが、引数に指定した値がNULLである限り、次の引数で指定した値を返そうとする動きがあり、2つ以上の複数の引数を持つことができます。NULLである限り次の引数を返そうとします。最後の引数がNULLならNULLのままになりますので、一番最後は固定のNULLでない値を指定することが多いと思います。NULLのままでは都合が悪い場合によく使います。もちろんNULLにしたい場合もありますので、使い方は自由です。なので、COALESCE句の最後の引数がNULLだからといって間違いという訳でもないです。よく考える必要があります。 | |||
この問題はではP03の在庫が指定されていないのに条件式で発注点という数値と大小を比較しようとしているので、NULLのときには0にしてほしいので、引数の最後がNULLであるのは具合が悪そうです。 | |||
比較する値が答えになっていますので、部品番号でまとめた在庫数の合計と比較したいので、SUM(在庫.在庫数)がよくて、在庫数が無い場合はOUTER JOINの結果、在庫数がNULLになっているので、その場合には0として欲しい。その要件を満たすのがCOALESCE(SUM(在庫.在庫数), 0)です。 | |||
したがって | |||
<span style = "background:linear-gradient(transparent 75%, #7fbfff 75%); font-weight:bold; "> | |||
ウ</span> | |||
が答えです。 | |||
[[AP過去問 令和6年度春期 午前 問25]]前の問題へ | [[AP過去問 令和6年度春期 午前 問25]]前の問題へ |
2025年1月31日 (金) 01:38時点における最新版
AP過去問 令和6年度春期 午前 問25前の問題へ
AP過去問 令和6年度春期 午前 問27次の問題へ
問26(問題文)
"部品"表及び"在庫"表に対し、SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。
部品 | 発注点 |
P01 | 100 |
P02 | 150 |
P03 | 100 |
部品ID | 倉庫ID | 在庫数 |
P01 | W01 | 90 |
P01 | W02 | 90 |
P02 | W01 | 150 |
部品ID | 発注要否 |
P01 | 不要 |
P02 | 不要 |
P03 | 必要 |
〔SQL文〕
SELECT 部品.部品ID AS 部品ID、
CASE WHEN 部品.発注点 > a
THEN N'必要' ELSE N'不要' END AS 発注要否
FROM 部品 LEFT OUTER JOIN 在庫
ON 部品.部品ID = 在庫.部品ID
GROUP BY 部品.部品ID、部品.発注点
ア COALESCE(MIN(在庫.在庫数)、0)
イ COALESCE(MIN(在庫.在庫数)、NULL)
ウ COALESCE(SUM(在庫.在庫数)、0)
エ COALESCE(SUM(在庫.在庫数)、NULL)
回答・解説
SELECT * FROM 部品 LEFT OUTER JOIN 在庫
- ON 部品.部品ID = 在庫.部品ID
のSQL実行結果は以下のようになります。外部結合しますが、結合先がない部品P03も外部結合によってNULL値として取り込まれます。
部品ID | 発注点 | 部品ID(在庫) | 倉庫ID | 在庫数 |
---|---|---|---|---|
P01 | 100 | P01 | W01 | 90 |
P01 | 100 | P01 | W02 | 90 |
P02 | 150 | P02 | W01 | 150 |
P03 | 100 | NULL | NULL | NULL |
この問題のSQLはどうやら発注点により複数の倉庫にある在庫の総数が少ない場合には発注要否に必要だと判定したいのだなと意図のわかりやすい問題のSQLになっているようです。この意図に気付けない場合は問題を解くのに迷宮入りしてしまいます。
CASE WHEN ~条件~ THEN ~成立時~ ELSE ~非成立時~ 句はSELECTで表示したい行についての処理にIF文のようなものを適用しようとする動きになります。
GROUP BY句で部品、発注点毎でグループ化するので、異なる倉庫についてはまとめるようにしていることも、伺えます。
あとは選択肢のCOALESCE句ですが、引数に指定した値がNULLである限り、次の引数で指定した値を返そうとする動きがあり、2つ以上の複数の引数を持つことができます。NULLである限り次の引数を返そうとします。最後の引数がNULLならNULLのままになりますので、一番最後は固定のNULLでない値を指定することが多いと思います。NULLのままでは都合が悪い場合によく使います。もちろんNULLにしたい場合もありますので、使い方は自由です。なので、COALESCE句の最後の引数がNULLだからといって間違いという訳でもないです。よく考える必要があります。
この問題はではP03の在庫が指定されていないのに条件式で発注点という数値と大小を比較しようとしているので、NULLのときには0にしてほしいので、引数の最後がNULLであるのは具合が悪そうです。
比較する値が答えになっていますので、部品番号でまとめた在庫数の合計と比較したいので、SUM(在庫.在庫数)がよくて、在庫数が無い場合はOUTER JOINの結果、在庫数がNULLになっているので、その場合には0として欲しい。その要件を満たすのがCOALESCE(SUM(在庫.在庫数), 0)です。
したがって
ウ
が答えです。
AP過去問 令和6年度春期 午前 問25前の問題へ
AP過去問 令和6年度春期 午前 問27次の問題へ