- 締切済み
SQLでの並び替え
以下のデータがあるとき 結果のような並びで一回のSQL文で取得したい のですが、どのような方法がありますか? ・列2が1時は 列1の昇順 ・列2が1以外の時は、列2の降順 列1 列2 20060501 1 20060502 1 20060506 1 20060508 1 20060501 2 20060502 2 20060506 2 結果としての並び 列1 列2 20060501 1 20060502 1 20060506 1 20060508 1 20060506 2 20060502 2 20060501 2
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- takkunnet
- ベストアンサー率74% (32/43)
Oracle 8i 以降なら以下のような感じでも可能です。 select 列1,列2,rank() over (order by 列1) from テーブル where 列2=1 union all select 列1,列2,rank() over (order by 列1 desc) from テーブル where 列2!=1 上記SQLをベースに並べ替え結果を保証するために select 'A',列1,列2,rank() over (order by 列1) from テーブル where 列2=1 union all select 'B',列1,列2,rank() over (order by 列1 desc) from テーブル where 列2!=1 order by 1,4 なかんじでいかがでしょう ちなみに 「・列2が1以外の時は、列2の降順」ではなく 「・列2が1以外の時は、列1の降順」 ですよね???
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
select * from x order by 列1,decode(列1,1,列1) asc,decode(列1,2,列2) desc ; でダメですかね?
ID Data1 Data2 1 1 1 2 2 1 3 3 1 4 1 2 5 2 2 というデータを ID|Data1|Data2| ------------- 1| 1| 1| 2| 2| 1| 3| 3| 1| 5| 2| 2| 4| 1| 2| と並べて抽出するために、 select * from table1 order by data2, data1 + data1 * (data2 -1) * -2; というSQL文を書いてみました。 なお、 select data1, data1 * (data2 -1) * -2 from table1; の実行結果は、 DATA1|(expession)| ------------------ 1| 0| 2| 0| 3| 0| 1| -2| 2| -4| となります。 data1 + data1 * (data2 -1) * -2 でソートした理由です。 ※デザイナーが本職ですので、もう少し、スマートな回答があると思いますが一応!