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