[pgsql-jp: 30673] Re: 2つのテーブルから Web 上でグループ表記

Takao Kato sirius @ jp.fujitsu.com
2003年 8月 4日 (月) 18:58:01 JST


加藤%外は暑かった ToT @川崎、です。

> > => SELECT a.No1,count(*) FROM tableA a,tableB b WHERE a.No1 = b.No_a order
> by a.No1 desc;
> 
> これを現在作ってるソースに当てはめ試しましたが上手く行きません
> そこで例としてあげたテーブルをそのままに作って試しましたがやはりエラー
> 
> ERROR:  Attribute a.no1 must be GROUPed or used in an aggregate function

オヤオヤ、自己フォローのほうを読んでもらえてないのかな ToT
これは「a.no1をGROUPedか集約関数を通さないと駄目」と言っているだけです。
つまり、

=> SELECT a.no1,count(*) FROM tA a,tB b WHERE a.no1 = b.no_a
->  GROUP BY a.no1         <==== ここ!!!
->  ORDER BY a.no1 desc;

で、GROUP BYすることで a.no1 が同一の行を一つにまとめます。その上で a.no1
のある値ごとにその行が何個あるか count(*) して出しています。例えば、

> => select a.*, b.* from tablea a, tableb b where b.no_a = a.no1 order by no1
> desc;

>  no1 | aaa | bbb | no2 | no_a | ddd
> -----+-----+-----+-----+------+-----
>  5   | す  | せ  | 10  | 5    | end
>  4   | こ  | さ  | 8   | 4    | uvw
>  4   | こ  | さ  | 9   | 4    | xyz
>  3   | き  | く  | 5   | 3    | lmn
>  3   | き  | く  | 6   | 3    | opq
>  3   | き  | く  | 7   | 3    | rst
>  2   | え  | お  | 4   | 2    | jkl
>  1   | あ  | い  | 1   | 1    | abc
>  1   | あ  | い  | 2   | 1    | def
>  1   | あ  | い  | 3   | 1    | ghi
> (10 rows)

ですと、

>  no1 | count
> -----+-------
>  5   |  1
>  4   |  2
>  3   |  3
>  2   |  1
>  1   |  3
> (5 rows)

となります。これでイメージ掴めました?凡例はシーラカンス本P149(第三版)
とかに載っていますので、そちらをど〜ぞ。


> GROUP BY での処理は私の知識が付いていかない (^^ゞ
> [pgsql-jp: 30563]を読んでも「これのtext版(仮にaggとしますが」の意味が理解で
> きませんでした。

例えば、no1 = 4だと

 no1 | aaa | bbb | no2 | no_a | ddd
-----+-----+-----+-----+------+-----
 4   | こ  | さ  | 8   | 4    | uvw
 4   | こ  | さ  | 9   | 4    | xyz

の2行が集約の対象になります。これをSQLで

 no1 |  aaa  |  bbb  |  no2 | no_a | ddd
-----+-------+-------+------+------+---------
 4   | こ,こ | さ,さ | 8,9  | 4,4  | uvw,xyz

と1行で出せると幸せじゃないですか?と言うことです。1行にまとめられれば
PHPなりperlで split してしまえば良いだけの話ですからね。


で、GROUP BYとか集約そのものは幾つも参考書籍/URLがあるのでそちらを参照
ください。説明を書いていて発散してしまいました。^^;

なお、発散する前の集約に関する説明は↓のような感じでした。

・GROUP BYは指定したカラムが同一の値を一つにまとめます(集約)。
・集約対象(今回はno1)以外のカラムは『同一』でなくても構わない。
・集約対象外のカラムに対する処理は集約関数以外使えない。
・集約関数にはCOUNT/SUM/MIN/MAX/AVGなどが準備されている。

デハデハ
-------------------------------------------------------------
加藤@川崎



pgsql-jp メーリングリストの案内