[pgsql-jp: 37801] 階級ごとの最大値や最小値の取り出し方を教えてください
"なかで"
nakade @ prjapan.jp
2006年 12月 18日 (月) 13:14:16 JST
中出と申します。
以下のような3つのテーブルがあるとします。
●usrテーブル
id | name
---+-----
1 | yamada
2 | hamada
3 | tanaka
4 | ueda
●usr_ptテーブル
id | usr_id | pt
---+--------+----
1 | 1 | 5
2 | 2 | -10
3 | 3 | 0
4 | 4 | 15
●usr_ckテーブル
id | usr_id | chkdate | ck
---+--------+------------+----
1 | 1 | 2006-12-15 | 3
2 | 1 | 2006-12-16 | 1
3 | 1 | 2006-12-17 | 4
4 | 2 | 2006-12-15 | 3
5 | 2 | 2006-12-16 | 5
6 | 3 | 2006-12-17 | 2
7 | 4 | 2006-12-17 | 5
usr_ptテーブルのptフィールドの値を10きざみの階級にわけて
その階級に含まれるusr_ckテーブルのckフィールドの値の
最大値、最小値、平均値とそのフィールドに含まれるデータ数
を取得したいと思ってます。
たとえば、2006-12-17のデータを取り出すのであれば
以下のようなデータを取り出したいと思っているのですが、
これをSQL1本でしてしまうことは可能でしょうか?
pt | ckの最大値 | ckの最小値 | ckの平均値 | データ数
-------------+------------+------------+------------+----------
-10以上0未満 | 0 | 0 | 0 | 1
0以上10未満 | 4 | 2 | 3 | 2
10以上20未満 | 5 | 5 | 5 | 1
現在は、以下のようなSQLでptとckのリストを取り出し、phpのほうで
上記のようなデータに整形しているのですが、データ数が多くなるに
つれて処理がつらくなってきたので、SQLのほうで楽に処理ができないか
と思い、相談させていただきました。
もし、よい案がございましたら教えてください。
select
sum(case when usr_ck.chkdate='2006-12-17' then usr_ck.ck else 0 end)
as usr__ck,
usr_pt.pt as usr__pt
from usr
left join usr_pt on usr_pt.usr_id=usr.id
left join usr_ck on usr_ck.usr_id=usr.id
group by usr__pt
order by usr__pt
では、失礼します。
--
nakade <nakade @ prjapan.jp>
pgsql-jp メーリングリストの案内