[pgsql-jp: 33304] Re: 登録されているデータを分割して集計

Mashiki mashiki @ yanah.com
2004年 6月 17日 (木) 12:03:11 JST


 Mashikiです。

>テーブルには
>id(serial) と list(text) という2つのフィールドがあります。
>list に 60<>50<>51<>40 等の文字列が入ります。
>
>集計は
>list の中の文字列を<>で分割して
>それぞれのカウントをとりたいと考えています。
>
>60 は 10個
>50 は 20個 …
>
>という感じです。

何故このようなテーブルの設計になっているのでしょう。

この集計が例外的にまれに行われるものであれば...

1.50と60と70だけであれば以下のSQLでいけます

select
 sum(case when list~'(^|<>)50(<>|$)' then 1 else 0 end) as cnt50
,sum(case when list~'(^|<>)60(<>|$)' then 1 else 0 end) as cnt60
,sum(case when list~'(^|<>)70(<>|$)' then 1 else 0 end) as cnt70
from tab1
;

2.全部欲しい場合、レコード件数×1000回の突合せが発生しますが

select '1', count(1) from tab1 where list~''(^|<>)1(<>|$)';
select '2', count(1) from tab1 where list~''(^|<>)2(<>|$)';
select '3', count(1) from tab1 where list~''(^|<>)3(<>|$)';
 :
select '1000', count(1) from tab1 where list~''(^|<>)1000(<>|$)';

を実行する。プログラミング言語やplpgsqlでやるべきでしょうけど。


# 自分であれば、listをばらしたテーブルの採用を検討したいですね



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