HOME»応用情報技術者試験掲示板»令和元年秋期午後問6設問2
投稿する

令和元年秋期午後問6設問2 [3199]

 ななさん(No.1) 
https://www.ap-siken.com/kakomon/01_aki/pm06.html
設問2の(2)fの答えはSUM(歩数.歩数)で、集約関数であるSUMを使用していますが、GROUP BYがどこにもありません。
集約関数を使用する際はGROUP BY等で条件を指定して、その条件に当てはまるものを計算する、というイメージだったのですが、この設問はなぜGROUP BYを利用せずに集約関数を使えているのでしょうか。
2022.03.09 09:51
chihiroさん(No.2) 
AP シルバーマイスター
今回の場合、ある従業員の、ある年月におけるレコード群しか結果として出てこないのでグループ化の必要がないからGROUP BYを使わずにそのままSUMを使用したのだと思われます。集約関数はGROUP BYを指定しなくても使用はできますが、その場合はWHERE句までの結果全体が集約関数の対象となります。
2022.03.09 10:32
 ななさん(No.3) 
chihiroさんありがとうございます。

>今回の場合、ある従業員の、ある年月におけるレコード群しか結果として出てこない

というのは、データとしては年月日として歩数テーブルに格納されているが、
登録の際は TOMY(歩数.測定日)=:レポート年月 を用いて年月として出力される、
という認識で合っていますか?
2022.03.09 11:47
chihiroさん(No.4) 
AP シルバーマイスター
>登録の際は TOMY(歩数.測定日)=:レポート年月 を用いて年月として出力される、という認識で合っていますか?
違います。WHERE句はあくまで条件に合致するレコードを探索するものであり、その探索中に探索するデータの型を変えたりはしません。TOMY(歩数.測定日)は年月の型ですが、WHERE句内でTOMY(歩数.測定日)…の箇所を実行したからといって、WHERE句の結果の歩数.測定日が年月の型に変わったりはしません。
2022.03.09 13:02
 ななさん(No.5) 
理解が及ばずすみません、
>今回の場合、ある従業員の、ある年月におけるレコード群しか結果として出てこないのでグループ化の必要がない
なぜこれだとグループ化の必要がないのかわかりません。
グループ化しないのならSUMを使う必要もないように感じます。

>TOMY(歩数.測定日)は年月の型ですが、WHERE句内でTOMY(歩数.測定日)…の箇所を実行したからといって、WHERE句の結果の歩数.測定日が年月の型に変わったりはしません。
とのことですが、TOMY(歩数.測定日)=:レポート年月を実行すると何が絞り込めるのでしょうか?
:レポート年月に合致するレコード(:レポート年月が2022-03なら2022-03-01から2022-03-31のレコード)が全て抽出されるといったことでしょうか?
2022.03.09 16:58
chihiroさん(No.6) 
AP シルバーマイスター
>TOMY(歩数.測定日)=:レポート年月を実行すると何が絞り込めるのでしょうか?
>:レポート年月に合致するレコード(:レポート年月が2022-03なら2022-03-01から2022-03-31のレコード)が全て抽出されるといったことでしょうか?
先にこちらから回答します。そのとおりです。WHERE句で絞り込んだ結果は全て特定の月のレコードになります。上の例であれば2022年3月1日~2022年3月31日のレコードです。
そもそも図3のSQL文の目的は「対象年月の月間総歩数を集計して更新する」ことです。WHERE句の結果はただのレコードの集まりであって、総歩数ではありません。総歩数を求めるためにSUMで各レコードの歩数(歩数.歩数)を合計するのです。得られたレコード群に、例えば2022年2月のレコードが混ざっていた場合、グループ化せずにSUMをするのはまずいでしょう。特定の年月の総歩数を求めたいのに、他の年月の歩数まで足したら正確な結果は得られませんから。ですが実際に得られたレコードは全て2022年3月のものなので、グループ化せずにそのままSUMをして、全レコードの歩数を合計しても、正しい結果が得られるというわけです。
2022.03.09 17:51
GinSanaさん(No.7) 
AP プラチナマイスター
この投稿は投稿者により削除されました。(2022.03.09 19:23)
2022.03.09 19:23
GinSanaさん(No.8) 
AP プラチナマイスター
何気なく使っている
セレクト count(*) フロム tbl
だって、結局全体の件数が欲しいけどgroup byしなくてもいい(※)から
そういう書き方ができるわけですよね。
テーブルの全体の数値の合算がほしくて、月数とかユーザとかそういうのが特に関係なければ、全体で集合を見ることで、group byをかけなくてもいいよね、という
そんなにややこしく考えなくてもいいとは思います。

※昔は実は集合関数を使う際にgroup byを省くことはできなかった。sql92より前かそこらの時代の話だけど、確かこれを知ったのは、ミック『達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ 』(CodeZine BOOKS) だったと思う。

2022.03.09 19:24
 ななさん(No.9) 
chihiroさん
丁寧な回答ありがとうございます。理解できました!

GinSanaさん
回答ありがとうございます。count(*)も言われてみればそうですね。
例え話わかりやすかったです。

お二方ともありがとうございました!
2022.03.10 10:28

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop