集計関数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とかだったらゴリゴリいけるね。