- PR -

このコマンドを簡潔にできませんか?@PostgreSQL

1
投稿者投稿内容
公太郎
会議室デビュー日: 2003/09/19
投稿数: 15
投稿日時: 2006-01-25 16:11
いつも拝見してばかりですが、よろしくお願いします。

「商品ID一覧を持ったテーブルCATEGORYの全品を対象に、
カテゴリIDで紐づくUSERLOGテーブルに記載されたレコードが何件あるかを抽出する」

当初、以下のようなSQLを発行しました。
SELECT
C.CID,
(SELECT COUNT(U.CID) FROM USERLOGS U WHERE C.CID=U.CID GROUP BY U.CID) AS CNT
FROM CATEGORY C
ORDER BY C.CID;

この場合、カウントが0件の場合、NULLとなってしまうため、
結果はNULL混じりのデータになってしまいます。
PostgreSQLをあまり扱ったことがないのですが、
単純に以下のようなSQLを作成し、目的を達することができました。

SELECT
C.CID,
CASE WHEN
(SELECT
COUNT(U.CID)
FROM
USERLOGS U
WHERE
C.CID=U.CID
GROUP BY
U.CID
) >0
THEN
(SELECT
COUNT(U.CID)
FROM
USERLOGS U
WHERE
C.CID=U.CID
GROUP BY
U.CID
)
ELSE 0
END
AS CNT
FROM
CATEGORY C
ORDER BY
C.CID;

しかし、素人目から見ても、明らかにスマートではありません。
もっと単純に片付ける方法はありますでしょうか?
プログラムでデータを加工すれば簡単ですが、
今回はSQLだけで片付けたいと考えております。
ご教授ください。
よろしくお願いいたします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-25 17:49
コード:
CREATE TABLE "CATEGORY"
(
  "CID" char(3) NOT NULL DEFAULT 0,
  CONSTRAINT "PK_CAT" PRIMARY KEY ("CID")
) 
WITHOUT OIDS;

CREATE TABLE "USERLOGS"
(
  "CID" char(3) NOT NULL DEFAULT 0,
  value varchar,
  "no" char(2) NOT NULL DEFAULT 0,
  CONSTRAINT "PK_LOG" PRIMARY KEY ("CID", "no")
) 
WITHOUT OIDS;

insert into "CATEGORY" values('001') ;
insert into "CATEGORY" values('002') ;
insert into "CATEGORY" values('003') ;
insert into "CATEGORY" values('004') ;
insert into "CATEGORY" values('005') ;
insert into "CATEGORY" values('006') ;
insert into "CATEGORY" values('007') ;
insert into "CATEGORY" values('009') ;


insert into "USERLOGS" values('001',null,'0') ;
insert into "USERLOGS" values('001',null,'1') ;
insert into "USERLOGS" values('001',null,'2') ;
insert into "USERLOGS" values('002',null,'0') ;
insert into "USERLOGS" values('003',null,'0') ;
insert into "USERLOGS" values('004',null,'0') ;
insert into "USERLOGS" values('005',null,'0') ;
insert into "USERLOGS" values('006',null,'0') ;
insert into "USERLOGS" values('007',null,'0') ;
insert into "USERLOGS" values('008',null,'0') ;




という状態で、以下のSQLを実行しました。
コード:
select "CATEGORY"."CID", count("USERLOGS".*) from "CATEGORY"  LEFT OUTER JOIN "USERLOGS" ON "USERLOGS"."CID" = "CATEGORY"."CID"
group by "CATEGORY"."CID"
order by "CATEGORY"."CID"



で、得られた結果は以下のとおりですが、期待に沿えてますか?
コード:
"CID",count
"001",3
"002",1
"003",1
"004",1
"005",1
"006",1
"007",1
"009",0

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-25 17:53
書き忘れました。
結果のNULLがいやならば、このドキュメントを読んで利用すといいかと思います。
http://www.postgresql.jp/document/pg812doc/html/functions-conditional.html#AEN12670
公太郎
会議室デビュー日: 2003/09/19
投稿数: 15
投稿日時: 2006-01-25 18:20
ありがとうございます。
試してみたところ、期待していた結果が返ってきました。
テーブル結合についてもいろいろと試してみたのですが、うまくいかなかったので、
もしかして使えないのかも・・・と思っておりました^^;
自分の作成したものと比較して、猛勉強します。
また機会がありましたら、よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)