アプリ版:「スタンプのみでお礼する」機能のリリースについて

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をグループ化して、都道府県名は同じなので、一つ都道府県名を表示するということですか?一つ間違えていたら、都道府県名が多いものを表示するので、間違いは表示されないということですか?

A 回答 (4件)

Max函数にテキスト型の値を与えたときには


文字コードの最大のものを返します

>都道府県IDをグループ化して、都道府県名は同じなので、一つ都道府県名を表示するということですか?
そうです。同じIDの都道府県名は皆同じのなので最大のものも同じと言うことになります

集計クエリでグループに指定していないものも表示させたいからこんな手法をとっているのでしょうけど
普通はIDと都道府県名の両方をグループに指定しますね

>一つ間違えていたら、都道府県名が多いものを表示するので、間違いは表示されないということですか?
そうはいかないですね
間違えている方の方が文字コードが大きければそっちを表示します
    • good
    • 0

#3です。



「つまり、提示のSQLでは、単純にPrefecturalNameを書くことができません。
PrefecturalNameを得るためには、素直にやる場合、もう一階層、クエリを増やすといったことをやらなければなりません。」

というのは、「group byに、PrefecturalNameを追加しないで行う場合」ですので、念のため。

RDBMSが不明ですが、MySQLには「group by指定時に、selectで指定できる列」に拡張仕様を持っています。
今回のようなケースで、max関数を使わず、PrefecturalNameという列名を書けます。ただし、PrefecturalNameの値が一意に定まる場合のみ結果は保証され、そうでないなら結果は保証されず、文法エラーにもならないので、「知っていて使うのには便利ですが、知らないで使う可能性もある」という機能です。
    • good
    • 0

「group by」指定時、selectの選択リストに指定できるのは、



(1)group byで指定した列
(2)max、countなどの集合(集計)関数
(3)定数

です。

つまり、提示のSQLでは、単純にPrefecturalNameを書くことができません。
PrefecturalNameを得るためには、素直にやる場合、もう一階層、クエリを増やすといったことをやらなければなりません。
しかし、maxやminを使っても結果が同じと分かっている場合、クエリを増やすのでなく、maxやmin関数を敢えて使うことで実現できます。

この回答への補足

「group by」指定時、selectの選択リストに定数が指定できるそうですが、実際の使用例があったら教えて下さい。

補足日時:2008/11/13 22:43
    • good
    • 0

ご推察のとおり、多分


「都道府県名は同じなので、一つ都道府県名を表示する」
ようにしているのだ思います。

普通は、Prefecturals.PrefecturalName をGROUP BYに
含めて使うような気がしますけど。

かなり以前に、Macで「GROUP BYに1カラムしか指定できない」
と言う強烈なDBがあり、そのような場合には有効なトリック
だと思います。

もしくはPrefecturalsが正規化されていなくて、PrefecturalID
と言いつつ、複数あるとか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す