- ベストアンサー
MAX(都道府県名)
Select Customers.PrefecturalID ,MAX(Prefecturals.PrefecturalName) AS 都道府県名 ,Count(*) As 顧客数 From Customers Join Prefecturals On Customers.PrefecturalID = Prifecturals.PrefecturalID Group By Customers.PrefecturalID ; 都道府県名にMAX関数を使っているのですが、MAX関数は最大値を求めるものですが、都道府県名にMAXを使って何をしているのですか? 都道府県IDをグループ化して、都道府県名は同じなので、一つ都道府県名を表示するということですか?一つ間違えていたら、都道府県名が多いものを表示するので、間違いは表示されないということですか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Max函数にテキスト型の値を与えたときには 文字コードの最大のものを返します >都道府県IDをグループ化して、都道府県名は同じなので、一つ都道府県名を表示するということですか? そうです。同じIDの都道府県名は皆同じのなので最大のものも同じと言うことになります 集計クエリでグループに指定していないものも表示させたいからこんな手法をとっているのでしょうけど 普通はIDと都道府県名の両方をグループに指定しますね >一つ間違えていたら、都道府県名が多いものを表示するので、間違いは表示されないということですか? そうはいかないですね 間違えている方の方が文字コードが大きければそっちを表示します
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
#3です。 「つまり、提示のSQLでは、単純にPrefecturalNameを書くことができません。 PrefecturalNameを得るためには、素直にやる場合、もう一階層、クエリを増やすといったことをやらなければなりません。」 というのは、「group byに、PrefecturalNameを追加しないで行う場合」ですので、念のため。 RDBMSが不明ですが、MySQLには「group by指定時に、selectで指定できる列」に拡張仕様を持っています。 今回のようなケースで、max関数を使わず、PrefecturalNameという列名を書けます。ただし、PrefecturalNameの値が一意に定まる場合のみ結果は保証され、そうでないなら結果は保証されず、文法エラーにもならないので、「知っていて使うのには便利ですが、知らないで使う可能性もある」という機能です。
- chukenkenkou
- ベストアンサー率43% (833/1926)
「group by」指定時、selectの選択リストに指定できるのは、 (1)group byで指定した列 (2)max、countなどの集合(集計)関数 (3)定数 です。 つまり、提示のSQLでは、単純にPrefecturalNameを書くことができません。 PrefecturalNameを得るためには、素直にやる場合、もう一階層、クエリを増やすといったことをやらなければなりません。 しかし、maxやminを使っても結果が同じと分かっている場合、クエリを増やすのでなく、maxやmin関数を敢えて使うことで実現できます。
- utakataXEX
- ベストアンサー率69% (711/1018)
ご推察のとおり、多分 「都道府県名は同じなので、一つ都道府県名を表示する」 ようにしているのだ思います。 普通は、Prefecturals.PrefecturalName をGROUP BYに 含めて使うような気がしますけど。 かなり以前に、Macで「GROUP BYに1カラムしか指定できない」 と言う強烈なDBがあり、そのような場合には有効なトリック だと思います。 もしくはPrefecturalsが正規化されていなくて、PrefecturalID と言いつつ、複数あるとか。
補足
「group by」指定時、selectの選択リストに定数が指定できるそうですが、実際の使用例があったら教えて下さい。