2013-05-08 4 views
0

У меня есть таблица с 20 столбцами, которые мне нравятся категоризировать;Как классифицировать несколько столбцов в одном выражении в SQL/PLSQL

0-25 --> 1 
25-50 --> 2 
50-75 --> 3 
75-100 --> 4 

Я предпочитаю не использовать 20 случаев ... когда заявления. Любой, кто знает, как сделать это более динамично & эффективно? Может быть SQL или PL/SQL.

Я пробовал некоторые PL/SQL, но я не видел простой метод использования имен столбцов в качестве переменных.

Большое спасибо.

Frans

+0

Я не видеть "20 столбцов" в вашем примере. Кажется, что есть только одна колонка. Можете ли вы разместить некоторые «реальные» образцы данных (столбцы/строки) и ожидаемый результат вашего заявления? –

ответ

1

case заявления является, вероятно, наиболее эффективным способом сделать это. Более динамичным способом было бы создание таблицы с использованием оператора with. Вот пример кода:

with ref as (
     select 0 as lower, 25 as higher 1 as val from dual union all 
     select 25, 59, 2 from dual union all 
     select 50, 75, 3 from dual union all 
     select 75, 100, 4 from dual 
    ) 
select ref.val 
from t left outer join ref 
    on t.col >= ref.lower and t.col < ref.higher 

Тем не менее, именно этот поиск может быть сделан с арифметикой:

select trunc((t.col - 1)/25) + 1 as val 
from t 

И, если ваша проблема управлением различными столбцами, вы могли бы рассмотреть unpivot. Тем не менее, я думаю, что, проще всего, просто написать код и изменить имена столбцов в текстовом редакторе или Excel.

3

Ваш пример немного сбивает с толку, но если вы хотите поместить определенное значение в эти категории, функции width_bucket может быть то, что вы после:

Что-то вроде этого:

with sample_data as (
    select trunc(dbms_random.value(1,100)) as val 
    from dual 
    connect by level < 10 
) 
select val, width_bucket(val, 0, 100, 4) as category 
from sample_data; 

Этом присвойт номерам 1-4 (случайным) значениям из sample_data. определяет диапазон, из которого можно построить ведра, а конечный параметр 4 говорит о том, сколько (одинаково широких) ведер должно распространяться. Результатом этой функции является ведро, в которое упадет значение val.

SQLFiddle пример: http://sqlfiddle.com/#!4/d41d8/10721