集計関数MIN(),MAX()をVARCHAR2項目に使用する

Oracle10g。

集計関数のMINやMAXってVARCHAR2項目にもつかえるのね。

コード値などで複数レコードに分けられてるデータを1レコードで表現したいということが結構よくある。
帳票系のプログラムとかね。
こんなかんじ。


ID コード値 名称
1    A   A名称
1    B   B名称
1    C   C名称

   ↓

ID コード値A 名称A コード値B コード値B コード値C 名称C
1    A    A名称   B     B名称    C    C名称



こういう場合まずUNION ALLとかDECODEをつかって以下のような状態を作る。


ID コード値A 名称A コード値B 名称B コード値C 名称C
1    A    A名称
1               B     B名称
1                           C    C名称


んでもってIDでGROUP BYして集計関数のMINやMAXを使って1レコードにする
別にMINやMAXに意味はなくてGROUP BYの制約のために使う。

結果としてはこんなSQLになる。


SELECT
 ID,
 MIN(コード値A) AS コード値A,
 MIN(名称A) AS 名称A,
 MIN(コード値B) AS コード値B,
 MIN(名称B) AS 名称B,
 MIN(コード値C) AS コード値C,
 MIN(名称C) AS 名称C
FROM
 …
GROUP BY
 ID


SUM()とか使って件数集計とかはよくやってたけどVARCHAR2でMINとMAXが使えるなんてしらなかった。
うれしそーに職場の人に話したらみんな知ってた…orz

常識なのね。


あ、HibernateのHQLではUNIONが使えないのでViewを作るしかないです。
IBatisとかだったらゴリゴリいけるね。