2014-10-20 88 views
1

我有2列数据库表“tbl_data” - col1和col2数据,我需要为每个行计算(col1/col2)。 使用此结果进行分类每个数据行分为以下几类:根据列值对数据库行进行分类

Category1: top 10% 
Category2: 20-30% 
Category3: 30-40% 
. . . 
. . . 
Category10: 90-100%.... 

(这里我不知道COL1/COL2的最大值,其在理想情况下是100%) 能否请你让知道如何表达这使用SQL查询?我正在使用MySQL

最后,我想显示基于桶(10%,10-20%,20-30%等等) 我分组到的记录。

回答

2

像这样的东西应该工作。

select 
    CASE 
    WHEN col1/col2 < 0.2 THEN '20%' 
    WHEN col1/col2 < 0.4 THEN '40%' 
    WHEN col1/col2 < 0.6 THEN '60%' 
    WHEN col1/col2 < 0.8 THEN '80%' 
    ELSE '100%' 
    END as category 
from tbl_data 

问题是我不确定你的意思是不知道col1/col2的最大值。

SQL Fiddle

基础上的评论,这样的事情可能会奏效,其中最大的是标准化:

select 
    CASE 
    WHEN col1/col2 < max_value * 0.2 THEN '20%' 
    WHEN col1/col2 < max_value * 0.4 THEN '40%' 
    WHEN col1/col2 < max_value * 0.6 THEN '60%' 
    WHEN col1/col2 < max_value * 0.8 THEN '80%' 
    ELSE '100%' 
    END as category 
from tbl_data 
    join (select max(col1/col2) as max_value 
      from tbl_data) as max_val 

SQL Fiddle for case number 2

+0

我的意思是MAX(COL1/COL2)是未知的,它在SQL来计算=>它就像[(COL1/COL2)/ MAX(COL1/COL2 )]> 0和<0.1,那么我把它分成10%的桶。 – 2014-10-20 01:12:42

0

这听起来像你想搜索的比例为十分位数。也许这你想要做什么:

select d.*, 1 + floor(10*(rank - 1)/@r) as decile 
from (select d.*, (@r := @r + 1) as rank 
     from tbl_data d cross join 
      (select @r := 0) vars 
     order by col1/col2 
    ) d 
+0

但是我得到的结果是所有的表行都只在decile1中分组。无法获得decile2,decile3等等... – 2014-10-20 01:22:58

相关问题