2015-03-03 2 views
2

У меня есть следующая таблица в моей базе данных OracleSplit ряд на основе значения

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

Существует сочетание генерации иерархии и строк здесь. См. Мой ответ. –

ответ

0

дам вам метод:

  1. Разделив значения столбца дадут количество строк вам нужно разбить.
  2. Затем дальнейшее разделение на этот счет разделило бы его на равное количество ведер. А затем остальное ROW GENERATOR способ.

Тестовый пример:

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

легко достичь с помощью подключения по:

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 
Смежные вопросы