2013-05-08 73 views
0

我有一張有20列的表格,我喜歡將其分類;如何在SQL/PLSQL的一個語句中對幾個列進行分類

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

我更喜歡不使用20 case ... when語句。任何人誰知道如何更有效地動態&?可以是SQL或PL/SQL。

我嘗試了一些PL/SQL,但我沒有看到一個簡單的方法來使用列名作爲變量。

非常感謝。

弗蘭斯

+0

我無法在您的示例中看到「20列」。似乎只有一列。你能發表一些「真實的」樣本數據(列/行)和你的陳述的期望輸出嗎? – 2013-05-08 13:25:06

回答

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; 

這將從sample_data中分配數字1-4到(隨機)值。 0, 100定義了構建桶的範圍,最後的參數4說明了應該分配多少個(同樣寬)的桶。該函數的結果是值爲val的桶。

SQLFiddle示例:http://sqlfiddle.com/#!4/d41d8/10721

相關問題