- PR -

1つのカラムのデータを、複数カラムに分離して取得

1
投稿者投稿内容
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2005-12-07 09:28
JSPからJDBCでデータベースのデータを取得して表示するWebアプリケーションを作成しています。
そこで『日付のカラム』と『値のカラム』を持つテーブルからデータを取得するのですが、
その際、『それぞれの年の同月データ』を別カラムとして取得する方法を探しています。
例えば、以下のようなテーブルがあるとして、
timeStamp_________ | data
--------------------+-----
2004-04-01 08:30:00 | 23.5
2004-04-02 08:30:00 | 23.6
2004-04-03 08:30:00 | 23.7
2004-04-04 08:30:00 | 23.8
.
.
.
2005-04-01 08:30:00 | 23.9
2005-04-02 08:30:00 | 24.5
2005-04-03 08:30:00 | 24.6

これを、以下のような形で取得したいのです。

date__________| 2004 | 2005
---------------+------+------
04-01 08:30:00 | 23.5 | 23.9
04-02 08:30:00 | 23.6 | 24.5
04-03 08:30:00 | 23.7 | 24.6
04-04 08:30:00 | 23.8 | null
.
.
.

現在、SQLでこの変換を行う方法が見つからないので、仕方なく
WHERE extract (month from timeStamp) = "4"
のような形で全ての年の対象月のデータを1列で取得して、
あとはJSPのJava部分でtimeStampカラムの文字列を解析して年毎に分離、というような力技を使ってます。
もしSQLで行える方法がありましたら、ご教授ねがえないでしょうか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-07 10:06
DBMSの種類は何でしょうか?
DBMSによってはOLAP用の集計関数をサポートしているので可能かもしれません。
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2005-12-07 10:10
説明足らずで失礼しました。
PostgreSQLの7.4.8です。

蛇足ながら、
OSはCentOS(RedHat系Linux)の4.2です。
JSPコンテナはTomcat4.1もしくは5.0で、
JDBCドライバはpg74.216.jdbc3.jar
です。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-12-07 10:26
PostgreSQLの7.4.8にそうした機能はないみたいですね。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2005-12-07 10:44
おはようございます。

ベタベタですけど・・・

コード:

SELECT
A.date__________
,(SELECT data FROM テーブル WHERE timeStamp_________ = CAST('2004-' + A.date__________ AS DATETIME) ) AS 2004
,(SELECT data FROM テーブル WHERE timeStamp_________ = CAST('2005-' + A.date__________ AS DATETIME) ) AS 2005
FROM (SELECT DISTINCT
SUBSTRING(CONVERT(CHAR(19),A.timeStamp_________,120),6,14) AS date__________
FROM テーブル
) A


MSのSQLServerの構文で申し訳ないです。
サブクエリで年月時分秒のみの表を作っといて、メインクエリで年ごとのデータを取得するってかんじです。
または、PL/pgSQLでカーソルとか使ってみるとか。

参考になればよいのですが・・・

[ メッセージ編集済み 編集者: かめたろ 編集日時 2005-12-07 10:53 ]
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2005-12-08 12:43
Anthyhimeさん、かめたろさん
ありがとうございます。
教えていただいたコードはそのままPostgreSQLで実行する事はできないようですが、
ロジックの流れとしてはわかりましたので、PostgreSQLで実現可能な文に変えて試してみようと思います。
OLAP用の関数がなかったのは残念ですが、おかげでopenOLAPなるソフトウェアを見つけることができたので、ちょっと用途は異なりますが勉強になりました。
1

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