0

我有一个包含 20 列的表格,我喜欢将其分类;

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

我不喜欢使用 20 case ... when 语句。任何知道如何更动态和有效地做到这一点的人?可以是 SQL 或 PL/SQL。

我尝试了一些 PL/SQL,但没有看到将列名用作变量的简单方法。

非常感谢。

弗兰斯

4

2 回答 2

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 的(随机)值。0, 100定义了构建桶的范围,最后一个参数表示4应该分配多少个(同样宽的)桶。该函数的结果是值val将落入的桶。

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

于 2013-05-08T13:29:55.477 回答
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 中编写代码和修改列名可能更容易。

于 2013-05-08T13:07:26.613 回答