2017-05-03 6 views
0

範囲値を与えるCase文があります。私は範囲賢い順に応じて結果セットをソートする必要があります。Oracle SQLの範囲値のソート

select distinct CASE 
    when Table__107.Column <= 30 then 
     '0-30' 
    when (Table__107.Column >= 31 and 
      Table__107.Column <= 60) then 
     '31-60' 
    when (Table__107.Column >= 61 and 
      Table__107.Column <= 90) then 
     '61-90' 
    when (Table__107.Column >= 91 and 
      Table__107.Column <= 120) then 
     '91-120' 
    when (Table__107.Column >= 121 and 
      Table__107.Column <= 180) then 
     '121-180' 
    when (Table__107.Column >= 181 and 
      Table__107.Column <= 365) then 
     '181-365' 
    when Table__107.Column > 365 then 
     '365+' 
    end as Column 

私の要求出力が

0-30 
31-60 
61-90 
..... 
..... 
365+ 

フラグ

である私はOrder by 1Order By ASCを使用してみましたが、それは最初に基づいてソートされます英数字の数字ではなく数値の数値です。

+0

私はOrder BY 1とOrder By ASCを使ってみましたが、最初の文字に基づいてソートしています。 – user1838000

答えて

1

まず、ソート可能な範囲の名前を変更できます。 。 。 000-030、 '031-060'などとなります。次に、値で直接注文することができます。

次に、ケース条件が順番に評価されることがわかっているので、ロジックを簡素化できます。

最後に、あなたがgroup byを使用して欲しいものを取得し、注文あとがき、各グループ内の最小値によって言うことができます:

select (case when Table__107.Column <= 30 then '0-30' 
      when Table__107.Column <= 60 then '31-60' 
      when Table__107.Column <= 90 then '61-90' 
      when Table__107.Column <= 120 then '91-120' 
      when Table__107.Column <= 180 then '121-180' 
      when Table__107.Column <= 365 then '181-365' 
      when Table__107.Column > 365 then '365+' 
     end) as Column, 
     count(*) -- this is a guess 
from t 
group by (case when Table__107.Column <= 30 then '0-30' 
       when Table__107.Column <= 60 then '31-60' 
       when Table__107.Column <= 90 then '61-90' 
       when Table__107.Column <= 120 then '91-120' 
       when Table__107.Column <= 180 then '121-180' 
       when Table__107.Column <= 365 then '181-365' 
       when Table__107.Column > 365 then '365+' 
      end) 
order by min(Table__107.Column); 
2

ただ、第二のカラムを作成する - 同じ基準(例)とが、注文番号で、その列で注文してください。このような

何か:

select distinct CASE 
    when Table__107.Col <= 30 then 
     '0-30' 
    when (Table__107.Col >= 31 and 
      Table__107.Col <= 60) then 
     '31-60' 
    when (Table__107.Col >= 61 and 
      Table__107.Col <= 90) then 
     '61-90' 
    when (Table__107.Col >= 91 and 
      Table__107.Col <= 120) then 
     '91-120' 
    when (Table__107.Col >= 121 and 
      Table__107.Col <= 180) then 
     '121-180' 
    when (Table__107.Col >= 181 and 
      Table__107.Col <= 365) then 
     '181-365' 
    when Table__107.Col > 365 then 
     '365+' 
    end as Col, CASE 
    when Table__107.Col <= 30 then 
     1 
    when (Table__107.Col >= 31 and 
      Table__107.Col <= 60) then 
     2 
    when (Table__107.Col >= 61 and 
      Table__107.Col <= 90) then 
     3 
    when (Table__107.Col >= 91 and 
      Table__107.Col <= 120) then 
     4 
    when (Table__107.Col >= 121 and 
      Table__107.Col <= 180) then 
     5 
    when (Table__107.Col >= 181 and 
      Table__107.Col <= 365) then 
     6 
    when Table__107.Col > 365 then 
     7 end as ord 
    from Table__107 
    order by ord 
+0

重複したロジックは醜いです – APC

2

タイムバケットは、参照データテーブルに値するデータの並べ替えのように見えます。しかし、あなたがそれらのためのテーブルを作成したくない場合でも、それらを1つとして扱うことのメリットがあります。

このソリューションでは、WITH句を使用して、ソート番号、下限と上限、および各時間バケットのラベルを持つサブクエリを作成します。これは、それが簡単になりますやって(例えば)各バケットにしてTable__107.col1秋のどのインスタンスを数える:

with buckets as ( 
    select 1 as bno, 0 as lb, 30 as ub, '0-30' as label from dual union all 
    select 2 as bno, 31 as lb, 60 as ub, '31-60' as label from dual union all 
    select 3 as bno, 61 as lb, 90 as ub, '61-90' as label from dual union all 
    select 4 as bno, 91 as lb, 120 as ub, '91-120' as label from dual union all 
    select 5 as bno, 121 as lb, 180 as ub, '121-180' as label from dual union all 
    select 6 as bno, 181 as lb, 365 as ub, '181-365' as label from dual union all 
    select 7 as bno, 365 as lb, 10000 as ub, '365+' as label from dual) 
select count(t107.col1) as col1_cnt 
     , b.label as bucket 
from buckets b 
     left outer join Table__107 t107 
      on t107.col1 between b.lb and b.ub 
group by b.bno, b.label 
order by b.bno  ; 

ロジックを複製する必要はありません。追加の利点は、外部結合を使用できるため、空のバケットを取得できることです。