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