2016-07-13 5 views
0

Iいくつかの例のデータを以下の4つの列を持つテーブルがのOracle注文 - ベースの機能

Aisle | Rack | Level | Position 
    1  1  1   1 
    1  2  1   2 
    2  1  1   1 
    2  2  1   1 
    2  3  1   1 
    3  1  1   1 
    3  2  1   1 

私は、次の使用してレコードをソートすることができ、単一のクエリを記述したい持っている

  • 最初にAisleによって(昇順)
  • 次にラックによって(1つの通路のための昇順および 次への降順など。これは私ができない部分です

    Aisle | Rack | Level | Position 
        1  1  1   1 
        1  2  1   2 
        2  3  1   1 
        2  2  1   1 
        2  1  1   1 
        3  1  1   1 
        3  2  1   1 
    

    を次のようにOracleので達成することができる場合トン)

  • はその後、レベルによって(昇順)
  • は、次にポジション(昇順)

によりだから、結果として注文した行は次のようになりますこれはOracleで達成可能ですか?

答えて

3

あなたがしなければならないことは通路を列挙することで、奇数と偶数を識別することができます。 dense_rank()関数はこれを行います。これはorder by節で許可されています。

ので:aisleは何のギャップを持っていない場合

order by aisle, 
     (case when mod(dense_rank() over (order by aisle), 2) = 1 
       then rack else - rack 
      end), 
     level, position 

は実際に、あなたも使用できます。

order by aisle, 
     (case when mod(aisle, 2) = 1 
       then rack else - rack 
      end), 
     level, position 
+0

感謝を。それは有望そうだ。ただ一つの注意点。私は奇数(またはさらに)の番号付き通路を働かせることも可能です。したがって、代替通路は昇降とラック降下に従うべきです。それは達成できますか? – Guddu

+1

ちょうどdense_rankを勉強し、答えがフィットします:-)多くのゴードンありがとう。 – Guddu

+0

クエリを実行すると、「ORA-01722:無効な番号」というエラーが表示されます。列はすべてVARCHAR2型です。私はそれを動作させるために何ができますか?助けてください。 – Guddu

関連する問題