- ベストアンサー
SQL初心者のためのselect文の表示結果の置き換え方
- SQL初心者の方がselect文の表示結果を置き換える方法について質問しています。具体的には、一つ前のレコードと同じ結果だった項目を任意の文字列で置き換える方法を知りたいそうです。
- 質問者はselect文の結果を以下のように表示したいと考えています。
- 埼玉 100 AAA 東京 200 BBB (〃)(〃) CCC (〃) 300 (〃) 千葉 400 (〃)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
lag関数使えば出来ないことはないと思うけど、列はすべてto_charで文字列にしなければいけないのが面倒くさそう。 http://oracle.se-free.com/dml/0601_lag.html
その他の回答 (1)
- nda23
- ベストアンサー率54% (777/1415)
考え方としては表示対象のレコードから見て、 「自分より小さい(前にある)レコード群の中の 最大値のレコード」が直前のレコードです。 自分より小さいレコード群(母集団)は以下のクエリです。 select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa>B.aaa group by A.aaa,A.bbb,A.ccc union select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa=B.aaa and A.bbb>B.bbb group by A.aaa,A.bbb,A.ccc union select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa=B.aaa and A.bbb=B.bbb and A.ccc>B.ccc group by A.aaa,A.bbb,A.ccc 元のテーブルから見て直前と等しいかどうかで判断します。 /*元になるselect文 */ select case when A.aaa=Max(B.xa) then '(〃)' else A.aaa end aaa ,case when A.bbb=Max(B.xb) then '(〃)' else A.bbb end bbb ,case when A.ccc=Max(B.xc) then '(〃)' else A.ccc end ccc from XXX A inner join /*母集団 */ (select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa>B.aaa group by A.aaa,A.bbb,A.ccc union select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa=B.aaa and A.bbb>B.bbb group by A.aaa,A.bbb,A.ccc union select A.aaa,A.bbb,A.ccc,max(B.aaa) xa,max(B.bbb) xb,max(B.ccc) xc from XXX A left join XXX B on A.aaa=B.aaa and A.bbb=B.bbb and A.ccc>B.ccc group by A.aaa,A.bbb,A.ccc) B /* 元と母集団の結合 */ on A.aaa=B.aaa and A.bbb=B.bbb and A.ccc=B.ccc group by A.aaa,A.bbb,A.ccc oracle特有の関数や文法は避けましたので、他のDBでも 多少の修正で動くと思います。 最適化の観点からは母集団を更にグループ化したものと 元のテーブルを結合する方が高速かも知れません。
お礼
ありがとうございます。 当方oracle sqlガチガチですので、今回は関数を使って楽をします。 お送り頂いた考え方は今後の参考にさせていただきます。
お礼
ありがとうございます。 不勉強でlag関数を知りませんでした。 decode関数とあわせて、シンプルに実現できました。 また「to_charで変換しなければならない」とのご指摘も非常に助かりました。 この一言がなければ、またまた悩むところでした!