2017-02-03 13 views
0

есть таблица TABLE01 с указанными ниже полей и значений:Необходимо разбить; разделенных данных в разных строках, а затем получить рассчитывать для каждой строки

COL1   COL2 COL3 COL4 COL5 COL6 COL7 
01-01-2017 P  123 abc Y  T  A1_A2 
01-21-2017 P  456 rst N  P  A1_A3;A4 
06-10-2017 P  876 hyi N  S  A2_A8;A5_A6;A9 
10-12-2017 P  999 iop Y  R  A7 

Теперь нужно создать новую таблицу, имеющие столбцы (col1, col2, COL3, COL4 , COL7 и COUNT_COL3), используя таблицу выше, разделив все ';' отделено COL7 в разные строки в соответствии со счетом каждого COL3

COL1   COL2 COL3 COL4 COL7  COUNT_COL3 
01-01-2017 P  123 abc A1_A2  1 
01-21-2017 P  456 rst A1_A3  2 
01-21-2017 P  456 rst A4   2 
06-10-2017 P  876 hyi A2_A8  3 
06-10-2017 P  876 hyi A5_A6  3 
06-10-2017 P  876 hyi A9   3 
10-12-2017 P  999 iop A7   1 

Я могу сделать splititng часть и добавляю 0 для подсчета не знает, как добавить счетчик часть

INSERT into TABLE02 (COL1, COL2,COL3,COL4,COL7,COUNT_COL3) 
SELECT COL1, COL2, COL3,COL4, 
      trim(COLUMN_VALUE) COL7, 0 
FROM TABLE01 
     xmltable(('"' 
     || REPLACE(COL7, ';', '","') 
     || '"')) 
; 

Может кто-то пожалуйста предложить?

+0

Попробуйте 'count (*) over (partition by col1, col2, col3, col4)' – krokodilko

+0

Это сработало! спасибо Крокодилко – Mishti

ответ

0

Похоже, что число, которое вы добавляете, - это количество строк, созданных путем расщепления, которое больше числа с запятой (;) в строке в COL7.

Это можно сделать с помощью 1 + regexp_count(COL7, ';'), который легко писать и понимать.

Старые таймеры расскажут вам, что стандартные строковые функции (в отличие от регулярных выражений) часто бывают намного быстрее. Это важно, только если производительность не является удовлетворительной.

В этом случае, счет может быть получен

1 + length(COL7) - length(replace(COL7, 'z;', 'z')) 

То есть: заменить все ; с «ничего» в COL7 и посмотреть, насколько короче струна становится, что покажет вам, сколько ; там были в строке. Дополнительный 'z' в replace() необходим, потому что replace() возвращает null, если любой аргумент (включая последний) - null. Одна из пяти тысяч странностей Oracle ... Как написано, функция заменит каждое вхождение z на z и каждый; с «ничего», так что это именно то, что мы хотим.