[pgsql-jp: 32235] Re: 集計方法について

Mashiki mashiki @ yanah.com
2004年 2月 9日 (月) 22:15:50 JST


 Mashikiです。

>なるほど!
>SQL結果にばかりこだわっておりました。
>
>煮詰まっておりましたので、目から鱗です。
>プログラムサイドで横展開させようと思います。

 もう解決されているようですし、今回の件はSQLで解決するのが
的確であったと言う報告ですので問題はないかと思うのですが、

 クロス集計の列が少数かつ限定されている場合には、SQL内に
列の値をハードコードして無理やり?SQLで対応するのもありとは
思いますが、限定できない場合や行数が非常に多い表に関しては
、川瀬さんのように二次元へのマッピングはプログラミング言語側
のほうがよいかと思います。


> select C1,
> sum(case C2 when 200 then 1 else 0 end),
> sum(case C2 when 300 then 1 else 0 end),
> sum(case C2 when 500 then 1 else 0 end)
> from Tbl1
> group by C1

の例だとC2の値として100と400と600が増えたときにSQLを変えなくては
いけません。


またDBの各行にC2のとりうる値分のの比較と足し算が増えるため、

 select C1,
 sum(case C2 when 000 then 1 else 0 end),
 sum(case C2 when 010 then 1 else 0 end),
 sum(case C2 when 020 then 1 else 0 end),
     :
     :
 sum(case C2 when 980 then 1 else 0 end),
 sum(case C2 when 990 then 1 else 0 end),
 from Tbl1
 group by C1

とした場合、行が30万行、C2の取りうる値が100通りの場合、3千万回の比較と
足し算を行うことになります。



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