2014-10-20 112 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