[pgsql-jp: 30112] Re: 複数条件での group by について
橋詰 洋
hashizume @ linx.co.jp
2003年 6月 2日 (月) 21:53:40 JST
斎見様、加藤様、千葉様、ご返答有難うございます。
ご指摘頂いた内容をもとに調べた結果、7.0.3でfrom句で副問い合わせが
使えない為、一般的なSQLで取得が難しいということが分かりました。
以降、調べた結果です。
■副問い合わせによる解決策の検証結果
加藤様、千葉様にご説明頂いた情報をもとに再度SQLを調べ直したところ
>----------------------------
>hogehoge_tbl
> a_name | b_code |
>--------------+------------+
> あ | a |
> あ | a |
> あ | b |
> い | a |
> い | a |
> い | b |
>----------------------------
のテーブルに対し
SELECT b_code,count(b_code) from (select * from hogehoge_tbl group by a_name,b_code) as temp group by b_code;
とSQLを書き直しました。
> SELECT b_code ,count(b_code) from hogehoge_tbl
> where (SELECT a_name from hogehoge_tbl group by a_name) group by b_code;
>のSQL文を読んでエラーが起こった意味を納得しました。これじゃぁ無理ですね。
#おっしゃられるとおりです、勉強不測でした。
☆上記テーブルに対し、書き直したSQLの実行結果
・PostgreSQL 7.0.3での実行結果
ERROR: parser: parse error at or near "select"
・PostgreSQL 7.2.2での実行結果
期待通りの結果
b | count
------+-------
a | 2
b | 2
☆結論
バージョンが低いため、このSQLでは期待した結果が出ないようです。
http://osb.sra.co.jp/PostgreSQL/7.1/changes.htmlを参照させて頂いたところ
7.1で
> subselectにおける各種制限が撤廃されました.具体的には,
> subselectがFROM句で使えるようになりました.
とありますので、7.0.3では他の手段を考える必要がありそうです。。
#正しいと思って書いていたSQLが"parse error"となった為混乱しつづけました^^;
■DISTINCTによる解決策の検証結果
>いまひとつ質問が不明瞭ですが、以下のように解釈します。
>・b_codeの値ごとにa_nameの種類数を求める。
説明が拙くて申し訳ありません。
斎見様のお言葉を借りて説明すると、
「b_codeの値ごとに、a_nameの種類数を求める。但し、a_nameが重複する場合はそれは種類数から除く」
といったことを伝えたかったのです^^;
distinctを利用するとした場合、ちなみにこんな感じのSQLでしょうか。
SELECT b_code,count(b_code) from (select distinct * from hogehoge_tbl ) as temp group by b_code;
こちらも上記”☆結論”と同様の理由のため無理かと思います。
pgsql-jp メーリングリストの案内