2015-03-03 58 views
2

我下表對我的Oracle數據庫拆分基於一個值的行

TopCode BottomCode Totalpeep 
A ABC123  100 
B BED456   45 

我想查詢是能夠基於該Totalpeep/20例如分割行將有5個組爲A和3組爲B,即使Totalpeep小於20,則它必須有一個基團

TopCode BottomCode Grp 
A  ABC123  A1 
A  ABC123  A2 
A  ABC123  A3 
A  ABC123  A4 
A  ABC123  A5 
B  BED456  B1 
B  BED456  B2 
B  BED456  B3 
+0

有層次和排輩的組合在這裏。看到我的答案。 – 2015-03-03 12:05:48

回答

0

我給你的方法:

  1. 除以列值會給行數您需要拆分。
  2. 然後進一步除以該數量將會把它分成相同的桶數。然後剩下的就是行發生器的方法。

測試用例:

SQL> CREATE TABLE t(
    2 topcode VARCHAR2(10), 
    3 totalpeep NUMBER); 

Table created. 

SQL> 
SQL> INSERT INTO t VALUES('A', 100); 

1 row created. 

SQL> INSERT INTO t VALUES('B', 45); 

1 row created. 

SQL> 
SQL> SELECT * FROM t; 

TOPCODE  TOTALPEEP 
---------- ---------- 
A     100 
B     45 

SQL> 

因此,SQL創建基於計數桶的數量相等:

SQL> WITH DATA AS 
    2 (SELECT t.*, t.totalpeep/20 wt_bucket FROM t) 
    3 SELECT topcode, topcode||level 
    4 FROM DATA 
    5 CONNECT BY LEVEL   <= wt_bucket 
    6 AND PRIOR topcode   = topcode 
    7 AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL 
    8/

TOPCODE TOPCODE||LEVEL 
---------- -------------------------------------------- 
A   A1 
A   A2 
A   A3 
A   A4 
A   A5 
B   B1 
B   B2 

7 rows selected. 

SQL> 

即使Totalpeep小於20那麼這必須有一組

在這種情況下,未使用的剩餘桶,也應考慮:

SQL> WITH DATA AS 
    2 (SELECT t.*, t.totalpeep/20 wt_bucket FROM t) 
    3 SELECT topcode, topcode||level 
    4 FROM DATA 
    5 CONNECT BY LEVEL   <= ceil(wt_bucket) 
    6 AND PRIOR topcode   = topcode 
    7 AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL 
    8/

TOPCODE TOPCODE||LEVEL 
---------- -------------------------------------------- 
A   A1 
A   A2 
A   A3 
A   A4 
A   A5 
B   B1 
B   B2 
B   B3 

8 rows selected. 

SQL> 

因此,與值組沒有劃分後一個整數,你可以考慮他們。

2

容易實現使用CONNECT BY:

with sample_data (TopCode, BottomCode, Totalpeep) as (select 'A', 'ABC123', 100 from dual union all 
                 select 'B', 'BED456', 45 from dual) 
select topcode, 
     bottomcode, 
     topcode||level grp 
from sample_data 
connect by prior topcode = topcode 
      and prior dbms_random.value is not null 
      and level <= ceil(totalpeep/20); 

TOPCODE BOTTOMCODE GRP          
------- ---------- ---- 
A  ABC123  A1 
A  ABC123  A2 
A  ABC123  A3 
A  ABC123  A4 
A  ABC123  A5 
B  BED456  B1 
B  BED456  B2 
B  BED456  B3