投稿する

[0288] R3午後Ⅰ問3設問1(1) ホ

 受験生さん(No.1) 
お世話になります。
掲題について質問させていただきます。

お聞きしたい内容は、解答の『沿線、TOTAL』のうち、『TOTAL』がGROUP BYの対象となる理由についてです。

まず、『沿線』についてはGROUP BYの対象となる理解ができました。
何故なら、SQLの説明から「沿線ごとに」集計することが分かるからです。

しかし、『TOTAL』は、テーブル自体に1レコードしかなく、グルーピングする必要性が分かりませんでした。

お手数おかけしますが、本疑問点について解説いただけますと幸いです。
2022.07.15 19:18
にゃんちゃんさん(No.2) 
DB シルバーマイスター
GROUP BYを使う場合
GROUP BY句に指定した列、集約関数(SUM、AVG、COUNT関数など)しか使えなくなります。

つまり「GROUP BY 沿線」とした場合は
沿線列と、COUNT(*)くらいしか使用できなくなります。

ところが本問のSQL文を見ると
SELECT 沿線,  の後に
FLOOR([ハ]*100/[ニ])となっており
[ハ][ニ]に入る列も使えないと困る(=GROUP BY句に指定する)ことになります。

[ハ]のCOUNT(*)は、集約関数なので問題なく使用できます。
[ニ]のTOTAL列は、GROUP BY句に指定しないと使えません。
2022.07.15 20:59
 受験生さん(No.3) 
にゃんちゃん様

ご回答いただきありがとうございます。

にゃんちゃん様がおっしゃられている「使えなくなる」とは、SELECT句で使用できなくなるという意味であると認識いたしましたが、この解釈は正しいでしょうか?

以上、ご確認お願いいたします。
2022.07.16 11:09
GinSanaさん(No.4) 
DB シルバーマイスター
グループバイ句に存在しない列名をセレクト句に指定するとエラーになるから、とかそういうストレートな話で対象になったのでは?
taityo-diary.hatenablog.jp/entry/2018/06/09/080903
SQLのGROUP BY句の処理を理解する
2022.07.16 15:57
にゃんちゃんさん(No.5) 
DB シルバーマイスター
GROUP BY句で指定しなかった列は
SELECT句でも使用できませんし、例えばORDER BY句にも指定できません。
唯一、集約関数内のみ使用可能です。

ここで登場するFLOOR関数は集約関数ではないので、ここでもGROUP BYにない列は使用できません。
2022.07.16 16:00
GinSanaさん(No.6) 
DB シルバーマイスター
世の中の実際の現場のひどいSQLだと、MAX(group byに入れたくない列名)とかやって無理矢理大量に入れたりしてますが、
おまえはサブクエリをしらんのか、という次元でひどい書き方なのでやめたほうがいいです。
2022.07.16 16:16
 受験生さん(No.7) 
GinSana様

コメントありがとうございます。

ご展開いただいたサイトを参考に、GROUP BYについて理解を深めることができました。

また、実際にSQLを書く際は、サブクエリをうまく使用するようにしたいと思います。

以上、ありがとうございました。
2022.07.17 21:41
 受験生さん(No.8) 
にゃんちゃん様

ご回答ありがとうございます。

詳細にご説明いただき、より理解を深めることができました。

以上、ありがとうございました。
2022.07.17 21:42

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2016-2024 データベーススペシャリストドットコム All Rights Reserved.

Pagetop