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

トップ西森 nishimori @ topworld.ne.jp
2004年 6月 17日 (木) 12:55:35 JST


ご回答ありがとうございます。西森です。

実はショッピングカートを作りたいのですが
どの商品がどれだけ売れたのか
という集計をとりたいと考えていました。
(60<>50<> … というのは商品のIDになります)

集計用に別のテーブルを作り、受注毎にカウントしたほうが
よさげですが、何か効率的な集計方法があればご教授宜しくお願いします。

また、現在テーブルに入っている値に +1 したいとき
今まで、値を取得して、プラス1した値でアップデート、と
2回SQLを実行していたのですが、
それが一回ですむスマートな文法はありますでしょうか。

----- Original Message ----- 
From: "Mashiki" <mashiki @ yanah.com>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Thursday, June 17, 2004 12:03 PM
Subject: [pgsql-jp: 33304] Re: 登録されているデータを分割して集計


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