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

ななさん  
(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さん 
AP シルバーマイスター
(No.2)
今回の場合、ある従業員の、ある年月におけるレコード群しか結果として出てこないのでグループ化の必要がないからGROUP BYを使わずにそのままSUMを使用したのだと思われます。集約関数はGROUP BYを指定しなくても使用はできますが、その場合はWHERE句までの結果全体が集約関数の対象となります。
2022.03.09 10:32
ななさん  
(No.3)
chihiroさんありがとうございます。

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

というのは、データとしては年月日として歩数テーブルに格納されているが、
登録の際は TOMY(歩数.測定日)=:レポート年月 を用いて年月として出力される、
という認識で合っていますか?
2022.03.09 11:47
chihiroさん 
AP シルバーマイスター
(No.4)
>登録の際は 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さん 
AP シルバーマイスター
(No.6)
>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さん 
AP プラチナマイスター
(No.7)
この投稿は投稿者により削除されました。(2022.03.09 19:23)
2022.03.09 19:23
GinSanaさん 
AP プラチナマイスター
(No.8)
何気なく使っている
セレクト 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日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop