- - PR -
PostgreSQL8.1でのcase式を利用した月別集計について
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2007-05-19 17:01
こんにちは、始めまして。
最近SQLを使い始めて少しだけ使えるようになってきました。 月別集計をしたいのでが、以下のSQL文では実行が出来ません。 具体的には、時間のところを整数型などにしたときは集計が可能なのですが、下記の様にcase式の返り値がintervalだと集計が出来ません。 文法的には間違っていないと思うのですが、"ERROR: CASE types integer and interval cannot be matched" が帰ってきて実行できません。 私の何か勘違いで実行できないのか、もともと出来ないのかが判りません。 もし可能であれば、どのように編集すれば出来るのか教えてきただけませんか? テーブルの形式としては テーブル名:勤務時間テーブル テーブル定義:社員ID(char)|年月日(date)|勤務時間(interval) といった感じです。実際には他にもフィールドはあるのですが、必要が無いので記入していません。 select 社員ID, sum(case when 年月日 >= '2006-09-01' and 年月日 < '2006-10-01' then 勤務時間 else 0 end) as "9月", sum(case when 年月日 >= '2006-10-01' and 年月日 < '2006-11-01' then 勤務時間 else 0 end) as "10月", sum(case when 年月日 >= '2006-11-01' and 年月日 < '2006-12-01' then 勤務時間 else 0 end) as "11月", sum(case when 年月日 >= '2006-12-01' and 年月日 < '2007-01-01' then 勤務時間 else 0 end) as "12月" from 勤務時間テーブル group by 社員ID order by 社員ID よろしくお願い致します。 [ メッセージ編集済み 編集者: 慣れないSQL 編集日時 2007-05-19 17:04 ] |
|
投稿日時: 2007-05-19 17:13
interval型は使った事がないのですが、エラーメッセージをみると、
interval型とinteger型の互換性がないということですよね。 case内のwhenではinterval型、elseではinteger型を返していますよね。ここが問題です。 "else 0 end"の"0"を、ゼロの間隔を示すinterval型に変換すればよいと思いますが、 (もしくはその逆) その関数は正直知りません。識者の方サポートお願いします。 |
|
投稿日時: 2007-05-19 17:20
>かつのりさん
うわぁ、ずっと勤務時間のほうがまずいと思ってましたorz ようは、0だとintervalとの計算が出来ないからエラーが返っていたということですね。 0のほうをinterval形式、つまり'(シングルクォート)をでくくってやれば 良いということorz まだまだ広い目で見ることが出来ていないのが良くわかりました。 ありがとうございました。 |
1
