ここから本文です

SQL文でGROUP BY句での質問です。 select shohin_bunrui,count(*) from Shohin ...

cho********さん

2011/9/2517:05:46

SQL文でGROUP BY句での質問です。
select shohin_bunrui,count(*)
from Shohin
group by shohin_bunrui
having shohin_mei='ボールペン'
としたらエラーになります。

_ここまでは本に「shohin_bunruiを集約キーにして集約した後のテーブルにはshohin_meiとゆう列はもう存在しない」と書かれており「(存在するのは集約キーのみ)だからselectではshohin_bunruiしか書けない」と捕らえれる事が書かれており、参考にしたらなんとなく理解しているのですが
select shohin_bunrui,AVG(hanbai_tanka)
from Shohin
group by shohin_bunrui
having AVG(hanbai_tanka)>=2500;
がエラーにならないのはなぜでしょうか?

もし集約した後に上のSQL文のようにshohin_meiの列が存在しないのなら、ここでもhanbai_tankaは存在しないはずなのでAVG関数に選択できないのではと思うのですが・・・
ご教授お願いします。

from Shohin,hanbai_tanka,having AVG,集約キー,GROUP BY句,グルーピング,集約関数

閲覧数:
584
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

pil********さん

2011/9/2601:46:13

なる程、ご指摘の疑問は、「集約(グルーピング)後の集合(テーブル)の要素にhanbai_tankaがない様に見えるのにhaving句でその項目に対する平均値が求められるのは何故か?」という事ですね。

私も気になったので、PostgresqlとAccessで以下の実験を行ってみました。

【実験1】
having句を行う際、集約後の項目として平均値自体が存在すれば、想定の結果となるはずだから、集約時のavg関数に別名を割り当てて、その別名項目をhavingの対象とすれば上手くいくのではないか? との想定で以下を発行。
(つまり、having句内では実際は関数の実行は行われておらず、集約時の射影項目とシンクロする項目名に置き換えられているのではないか?と想定しました)
select shohin_bunrui,AVG(hanbai_tanka) as heikin_hanbai_tanka
from Shohin
group by shohin_bunrui
having heikin_hanbai_tanka>=2500;

→構文エラーとなりました。(accessのエラーはよく分かりませんでしたが、Posgresqlはhaving句内の「heikin_hanbai_tanka」は存在しないといわれました)

【実験2】
そもそもhanbai_tankaはhaving句を実行する際に集約後の項目として全く保持されていないのであろうか?
ひょっとしたら、集約後も内部的に保持されているのではないだろうか?
内部的に保持されているのであれば、avg関数以外の集約関数も使用できるはずである。 との想定で以下を発行。

select shohin_bunrui,AVG(hanbai_tanka)
from Shohin
group by shohin_bunrui
having count(hanbai_tanka)>=2; ※countに変更した為、条件を変えています。

→正常に動作しました。(maxなどでも同様の結果を得ました)

【結論】
havingを行う際、グルーピング時にもし集約関数を使用している場合は、該当の項目はこっそり内部的に保持されている様です。
その為、having句内で該当項目の利用は可能となる様です。(当然、集約関数の利用が前提ですがね)
参考になさった本は、記述が曖昧ですが、集約関数に使用された項目自体が集約後のテーブルに存在しないとは言っていないので、必ずしも間違っているとは言えない様です。

以上、ご参考まで。

ベストアンサー以外の回答

1〜1件/1件中

ya_********さん

2011/9/2609:39:51

リファレンスも読んでみるといいと思いますよ。
使っているpostgreSQLのバージョンが不明なので最新版と思われるものを提示しますが、
http://www.postgresql.jp/document/current/html/queries-table-expres...
>一般的に、テーブルがグループ化されている場合、GROUP BYでリストされていない列は集約式を除いて参照することはできません。
です。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる