平成29年秋期 午後問6

田中さん  
(No.1)
https://www.ap-siken.com/kakomon/29_aki/pm06.html

平成29年秋期 午後問6  設問3についての質問です。

この問題での私の解答は以下の通りでした。
f: s UM(t1.パレット数*t1.単価)
g: i NNER JOIN 仕入明細 u SING (仕入番号,仕入明細番号)
h: 品目コード,産地コード,単価,パレット数

※投稿の際にエラーが出たので先頭を小文字にしています。

正解では、f: のパレット数はt2テーブルを参照しています。
私の解答では、GROUP BY でt1テーブルに単価とパレット数を残しておき、そちらを参照するといったものです。

私はSQLに慣れていないので、この考え方が間違っているのか分かりません。
いずれにしてもあまりスマートな方法ではないように見えますが、この書き方でも筋は通っているのでしょうか。
ご教授いただければ幸いです。
よろしくお願いいたします。
2023.07.17 23:26
jjon-comさん 
AP プラチナマイスター
(No.2)
> 正解では、f: のパレット数はt2テーブルを参照しています。

いいえ、公式解答例は SUM(t2.単価 * t1.パレット数) です。
t2.パレット数は参照していません。

> この問題での私の解答は以下の通りでした。
> f: s UM(t1.パレット数*t1.単価)

図4の「FROM 返品 t1」より、t1は"返品"表の別名であることが分かります。
図2より、"返品"表の列は次の5つであることが分かります。
返品番号, 返品日, 販売番号, 販売明細番号, パレット数

以上より、"返品"表には"単価"列が存在しないことが分かります。
よって、t1.単価は存在しない列を指しているためエラーになります。
2023.07.18 00:42
jjon-comさん 
AP プラチナマイスター
(No.3)
(これは質問者に対する回答ではありません)

意外だった点を一つ。

SELECT 品目コード, 品目名, 産地コード, 産地名, (…集約関数は略…)
(…略…)
GROUP BY [ h ]

の h の正解は「品目コード, 品目名, 産地コード, 産地名」
一択だと私は思い込んでいたのですが、

別解として「品目コード, 産地コード」もあると、
6年も前に公式解答例が示されているんですね。
2023.07.18 00:51
GinSanaさん 
AP プラチナマイスター
(No.4)
この投稿は投稿者により削除されました。(2023.07.18 18:30)
2023.07.18 18:30
GinSanaさん 
AP プラチナマイスター
(No.5)
この投稿は投稿者により削除されました。(2023.07.18 18:31)
2023.07.18 18:31
GinSanaさん 
AP プラチナマイスター
(No.6)
解説を見ると、ANSI的には許可されていますが、各RDBMSの実装によってはうまくいかない場合があります(例:ORACLE)
別解を覚えるよりはGROUP BYの特性を理解した上での本来の回答がいい気はします
with 返品 as (
セレクト '01' as 品目コード, 3 as パレット数 フロム dual
)
, 品目 as (
セレクト '01' as 品目コード, 'hoge' as 品目名 フロム dual
)
セレクト 品目コード, 品目名, sum(パレット数) AS パレット数 フロム 返品 インナージョイン 品目 using(品目コード) group by 品目コード, 品目名
これはふつうに通るが、
with 返品 as (
セレクト '01' as 品目コード, 3 as パレット数 フロム dual
)
, 品目 as (
セレクト '01' as 品目コード, 'hoge' as 品目名 フロム dual
)
セレクト 品目コード, 品目名, sum(パレット数) AS パレット数 フロム 返品 インナージョイン 品目 using(品目コード) group by 品目コード

ORA-00979: GROUP BYの式ではありません。
が返ってきた。
2023.07.18 18:33
田中さん  
(No.7)
jjon-comさん, GinSanaさん お返事ありがというございます。

返品t1にインナージョインで仕入れ明細,品目,産地テーブルを結合しているので、仕入れ明細に含まれる"単価"と"パレット数"もt1の属性として追加されていると考え、この解答に至った次第です。
そして、 h: のGROUP BY で品目コード,産地コード,単価,パレット数を指定することにより、SELECT文で S U M(t1.パレット数*t1.単価)とすることが出来ると考えました。


まだ勉強中の身なので、各RDBMSで動作の違いについての理解はありませんが、解説通りに覚える方が無難なようですね。
また、私の解答について、誤って理解している箇所があればご指摘いただけると助かります。今後の勉強になります。

よろしくお願いいたします。
2023.07.18 22:37
jjon-comさん 
AP プラチナマイスター
(No.8)
> 仕入れ明細に含まれる"単価"と"パレット数"もt1の属性として追加されていると考え

いいえ、そういう動作にはなりません。

次の5つの表に対して、
----
返品 t1
返品番号, 返品日, 販売番号, 販売明細番号, パレット数

販売明細 t2
販売番号, 販売明細番号, 仕入番号, 仕入明細番号, パレット数, 単価

仕入明細
仕入番号, 仕入明細番号, 品目コード, 産地コード, パレット数, 単価

品目
品目コード, 品目名

産地
産地コード, 産地名
----

次の FROM … JOIN句を実行した結果、
----
FROM 返品 t1
INNER  JOIN 販売明細 t2 USING(販売番号, 販売明細番号)
INNER  JOIN 仕入明細 USING(仕入番号, 仕入明細番号)
INNER  JOIN 品目 USING(品目コード)
INNER  JOIN 産地 USING(産地コード)
----

得られる表の列は次のようになります。
----
返品番号, 返品日, 販売番号, 販売明細番号, t1.パレット数, 仕入番号, 仕入明細番号, t2.パレット数, t2.単価, 品目コード, 産地コード, 仕入明細.パレット数, 仕入明細.単価, 品目名, 産地名
----

上記より、t1.パレット数, t2.パレット数, 仕入明細.パレット数 はそれぞれ別の列であることが分かります。
2023.07.19 00:13
田中さん  
(No.9)
jjon-comさん、ありがとうござます。

ようやく自分が勘違いしていた部分を理解できました。

FROM 返品 t1
INNER  JOIN 販売明細 t2 USING(販売番号, 販売明細番号)
INNER  JOIN 仕入明細 USING(仕入番号, 仕入明細番号)
INNER  JOIN 品目 USING(品目コード)
INNER  JOIN 産地 USING(産地コード)

この文により結合された表をt1だと考えていたところがおかしかったようです。
t1はt1のままなのですね。

ここからは問とは別の話になりますが、もし結合後の表を "t0" としたとき、
S U M(t0.パレット数*t0.単価)
とすると、正解と同じ答えになるのでしょうか。
2023.07.19 19:38
jjon-comさん 
AP プラチナマイスター
(No.10)
> もし結合後の表を "t0" としたとき、
> S U M(t0.パレット数*t0.単価)
> とすると、正解と同じ答えになるのでしょうか。

いいえ、なりません。

回答No.8で述べたとおり、
得られる表の中には
t1.パレット数, t2.パレット数, 仕入明細.パレット数 という異なる列が存在するので
t0.パレット数 ではどれを指しているのか明示できません。
得られる表の中には
t2.単価, 仕入明細.単価 という異なる列が存在するので
t0.単価 ではどれを指しているのか明示できません。
2023.07.19 23:59

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop