[pgsql-jp: 26026] Re: GROUP BY などについて

KAWAI,Takanori GCD00051 @ nifty.ne.jp
2002年 5月 19日 (日) 07:42:36 JST


川合孝典です。

----- Original Message -----
From: "Kasumi Iwata" <Kasumi_Iwata @ virtems.com>
To: "postgreSQL" <pgsql-jp @ ml.postgresql.jp>
Sent: Sunday, May 19, 2002 12:04 AM
Subject: [pgsql-jp: 26022] GROUP BY などについて


> はじめまして岩田と申します。
>
> 早速質問ですが、下のようなテーブルを作成しまして、簡易アンケートの
> システムを作っています。1つの質問に対し、複数の選択肢が用意され、
> ユーザーはその選択肢のなかから1つ選択するというしくみです。
(中略)
> qn_itemテーブルからcontentを取り出し、qn_voteテーブルから同じ質問
> (qn_vote.qn)で、同じ項目(qn_vote.item)が選択されているものを数えた
> いのです。
「外部結合」あるいは「OUTER JOIN」というキーワードをSQLの本で
調べると答えが見つかるでしょう。
#シーラカンス本の第三版だとP164に説明あり

ちなみに小野さんの書かれた(+)っていう書き方はOracleでしか見た覚えが
ありませんが、PostgreSQLで使えるんでしょうか?

今のテーブルだけでやろうとすれば、
SELECT   qn_item.id, count(qn_vote.uid)
FROM      qn_item
LEFT OUTER JOIN qn_vote ON
   qn_item.qn = qn_vote.qn and
   qn_item.id = qn_vote.item
WHERE  qn_item.qn=1
GROUP BY qn_item.id;

とか。ただやりたいことの内容からするとqn_itemのcontentも取り出し
たいのだとすると

SELECT qn_item.id,
      MAX(qn_item.content),count(qn_vote.uid)
FROM      qn_item
LEFT OUTER JOIN qn_vote ON
   qn_item.qn = qn_vote.qn and
   qn_item.id = qn_vote.item
WHERE  qn_item.qn=1
GROUP BY qn_item.id;

#ウーン強引
私としてはVIEWを1つ作ったほうが、気持ち悪くないと思います。
件数は0ではなくNULLが返って来ますけど。

CREATE VIEW qn_vcnt AS
 SELECT qn, item, count(*) as count
from qn_vote group by qn, item;

SELECT qn_item.id,qn_item.content, qn_vcnt.count
FROM   qn_item
LEFT OUTER JOIN qn_vcnt ON
   qn_item.qn = qn_vcnt.qn and
   qn_item.id = qn_vcnt.item
WHERE  qn_item.qn=1;

[実行サンプル]
(1)データ例
insert into qn(id, title) values(1, 'TEST1');
insert into qn_item values(1, 1, 'ITEM1');
insert into qn_item values(1, 2, 'ITEM2');
insert into qn_item values(1, 3, 'ITEM3');
insert into qn_vote(qn, uid, item) values(1, 1, 1);
insert into qn_vote(qn, uid, item) values(1, 2, 1);
insert into qn_vote(qn, uid, item) values(1, 3, 1);
insert into qn_vote(qn, uid, item) values(1, 4, 3);
insert into qn_vote(qn, uid, item) values(1, 5, 3);


SELECT qn_item.id,
      MAX(qn_item.content),count(qn_vote.uid)
FROM      qn_item
LEFT OUTER JOIN qn_vote ON
   qn_item.qn = qn_vote.qn and
   qn_item.id = qn_vote.item
WHERE  qn_item.qn=1
GROUP BY qn_item.id;

 id |  max  | count
----+-------+-------
  1 | ITEM1 |     3
  2 | ITEM2 |     0
  3 | ITEM3 |     2
(3 rows)

SELECT qn_item.id,qn_item.content, qn_vcnt.count
FROM   qn_item
LEFT OUTER JOIN qn_vcnt ON
   qn_item.qn = qn_vcnt.qn and
   qn_item.id = qn_vcnt.item
WHERE  qn_item.qn=1;

 id | content | count
----+---------+-------
  1 | ITEM1   |     3
  2 | ITEM2   |
  3 | ITEM3   |     2
(3 rows)

===================================================
川合 孝典 (Hippo2000)
   DBI日本語メーリングリスト管理人、Kansai.pm所属
   kwitknr @ cpan.org GCD00051 @ nifty.ne.jp
   http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
「Perlドキュメント日本語訳」メーリングリストがはじまりました
http://www.freeml.com/ctrl/html/MLInfoForm/perldocjp@freeml.com
===================================================




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