- PR -

PostgreSQL8.1でのcase式を利用した月別集計について

1
投稿者投稿内容
慣れないSQL
会議室デビュー日: 2007/05/19
投稿数: 2
投稿日時: 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 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-05-19 17:13
interval型は使った事がないのですが、エラーメッセージをみると、
interval型とinteger型の互換性がないということですよね。
case内のwhenではinterval型、elseではinteger型を返していますよね。ここが問題です。

"else 0 end"の"0"を、ゼロの間隔を示すinterval型に変換すればよいと思いますが、
(もしくはその逆)
その関数は正直知りません。識者の方サポートお願いします。
慣れないSQL
会議室デビュー日: 2007/05/19
投稿数: 2
投稿日時: 2007-05-19 17:20
>かつのりさん
うわぁ、ずっと勤務時間のほうがまずいと思ってましたorz
ようは、0だとintervalとの計算が出来ないからエラーが返っていたということですね。
0のほうをinterval形式、つまり'(シングルクォート)をでくくってやれば
良いということorz

まだまだ広い目で見ることが出来ていないのが良くわかりました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)