応用情報技術者 平成27年秋期 午前問29

質問君さん  
(No.1)
SELECT 商品コード,SUM(在庫数) AS 在庫合計 FROM  倉庫別商品在庫集計 WHERE 【商品コード IN(SELECT  商品コード FROM  倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND
在庫数 >= 100)】
GROUP BY 商品コード
ーーーーーーーーーーーーーーーーー
【】部分は私の挿入でこれが答えのウの部分です。
SQLについてまだよくわかってないのですが、
IN以下の副問い合わせのもう一つ別の表を作って、その表の条件に合致するよう最初のSELECT以下の条件の票を合致させていくとうイメージでよろしいのでしょうか?
この問題だと、倉庫番号C003、在庫数100以上の条件にあう商品コード列の表を作り、その商品コードと合致する商品コードを倉庫別商品在庫集計から抽出すると。ここでGROUP BYがよく分からなくなるのですが、GROUP BYは
(SELECT・・・・>=100)の作業の中に含まれず、この後、SELECT 商品コード,SUM(在庫数) AS在庫合計 FROM  倉庫別商品在庫集計を作成した後、GROUP BYするという意味でよろしいのでしょうか?
SELECT 商品コード,SUM(在庫数) AS在庫合計 GROUP BY 商品コードとしてしまえないのは何故ですか?
頭から書いた方が分かりやすいです。

あとEXISTSについてよく分かっていないのですが、基本的には同じような考え方なのでしょうか?
「副問合せは1行以上の結果セットを返しEXISTSは常に真と判定されるため、条件による絞り込みが機能しません。」
この説明がいまいち理解できません
WHERE EXISTS(SELECT * FROM  倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND
在庫数 >= 100)と*になっているのもいまいち
理解出来ません  倉庫番号003で在庫数が100以上の場合、
何をselectするのか?*を使うと全ての列が選択される、つまり行を選択するというイメージがあるのですが。そこでその行と同じ行が在庫合計に存在するなら、それはそれで何が間違っているのか?という気もします

とりとめなくてすいません。
2017.01.09 16:46
もじもじさん 
(No.2)
うーん。構文とデータ操作・定義言語の意味から理解したほうがいいかもしれませんね。

GROUP BYのところですが、
>・・・作成した後、GROUP BYするという意味でよろしいのでしょうか?
そうです。集計後、どうやって表示するかの指定だからです。
>SELECT 商品コード,SUM(在庫数) AS在庫合計 GROUP BY 商品コードとしてしまえないのは何故ですか?
まず、FROM句がないためどの表からデータを取り出すのか指定されていません。
あったとしても、すでに倉庫別商品在庫集計に問題文で問われているデータが揃っていればそれでもいいですが(?)、ないから作りましょって話ですよ。

>あとEXISTSについて・・・
全体で「TRUE」または「FALSE」の評価をするので、SELECT * FROM  倉庫別商品在庫集計 WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100 の結果は「TRUE」なので、倉庫別商品在庫集計の中身すべてが出力されます=「副問合せは1行以上の結果セットを返しEXISTSは常に真と判定されるため、条件による絞り込みが機能しません。」という意味です。

私自身DBが得意というわけではないので、細かい部分で違うかもしれませんが、参考になればと思います。
2017.01.11 11:12
管理人 
(No.3)
[GROUP BY句について]
副問合せのSQL文を実行すると、倉庫番号が'C003'で在庫数が100以上の行が抽出され、SELECT句によってそれらの行の商品コードのリストが結果セットとして返されます。
"倉庫別商品在庫集計"表には(商品コード'S001',倉庫番号'C003')と(商品コード'S001',倉庫番号'C005')などのように同じ商品が複数の倉庫に格納されている可能性があります。このため副問合せから返される商品コード1つにつき条件合致する行は複数存在することになります。

設問には「全ての倉庫における在庫数の合計を求めたい」としているため、全倉庫の合計数を算出するために条件に合致した複数の行を商品コードごとにグループ化する必要があります。

> SELECT 商品コード,SUM(在庫数) AS在庫合計 GROUP BY 商品コードとしてしまえないのは何故ですか?

GROUP BYが最後に記述されているのはSQLの構文による制約です。
SQLでは、WHWRE句→GROUP BY句→HAVING句→SELECT句→ORDER BY句の順番で処理させることが決まっています。GROUP BY句はWHERE句で絞り込まれた結果に対してグループ化を行うため、WHERE句より後に記述することになっています。
…もし話がずれていたら申し訳ありません。
2017.01.11 14:45
管理人 
(No.4)
[EXISTSについて]
>何をselectするのか?*を使うと全ての列が選択される、つまり行を選択するというイメージがあるのですが。

EXISTSは結果が1行以上存在すればTRUE、そうでなければFALSEを返します。結果の値にかかわらず存在するか否かで判定を行うため、SELECT 商品コード としても、SELECT * としても、はたまたSELECT 在庫数 としても判定結果は変わりません。このためEXISTS句の選択項目リストには*が指定されることがほとんどです。
2017.01.11 14:57

返信投稿用フォーム

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

その他のスレッド


Pagetop