[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 メーリングリストの案内