• 締切済み

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

みんなの回答

  • takkunnet
  • ベストアンサー率74% (32/43)
回答No.3

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の降順」 ですよね???

回答No.2

select * from x order by 列1,decode(列1,1,列1) asc,decode(列1,2,列2) desc ; でダメですかね?

noname#22222
noname#22222
回答No.1

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 でソートした理由です。 ※デザイナーが本職ですので、もう少し、スマートな回答があると思いますが一応!