Есть ли способ разделить текст из ячейки на несколько записей в SQL с помощью разделителя переноса строк? - PullRequest
1 голос
/ 08 февраля 2020

У меня есть отчет, сгенерированный системой, который экспортирует все отчеты о расходах за определенный период. Все сотрудники, прикрепленные к отчету, экспортируются в одно поле «Участники», разделяя несколько сотрудников с переносами строк.

Я хотел бы разбить ячейку на несколько записей, включая отчет о расходах НЕТ. на каждой записи.

Обратите внимание, что имена в поле участника имеют разные форматы, но все они заканчиваются на ")".

Есть ли способ использовать разрыв строки в качестве разделителя и создавать новую запись с каждым разрывом и заполнять такими же значениями других полей в исходной записи?

SQL будет идеальным интерфейсом, но я могу использовать Python, R, Tableau и PowerBI перед импортом в сервер, если это будет необходимо.

Пример ниже.

System Generated Report & Desired Result

1 Ответ

0 голосов
/ 08 февраля 2020

SQL Сервер:

SELECT ExpRep, ltrim(value+')')
FROM employees
    CROSS APPLY STRING_SPLIT(Attendees, ')')
WHERE RTRIM(value) <> ''; 

Oracle:

select ExpRep
       , Attendees || ')'
from (select ExpRep
             , ltrim(regexp_substr(Attendees, '[^)]+', 1, levels.column_value)) as Attendees
      from test
           , table(cast(multiset(select level 
                                 from dual connect by  level <= length (regexp_replace(Attendees, '[^)]+'))  + 1) as sys.OdciNumberList)) levels)
where Attendees is not null;

MySQL: (Действителен только для примеров, в которых у вас будет 5 разных сотрудников в столбце «Посетители». Если да, добавьте union all ...)

select
  ExpRep,
  concat(ltrim(SUBSTRING_INDEX(SUBSTRING_INDEX(Attendees, ')', numbers.n), ')', -1)),')') name
from (select 1 n 
      union all select 2 
      union all select 3 
      union all select 4 
      union all select 5) numbers INNER JOIN test
  on CHAR_LENGTH(Attendees)
     -CHAR_LENGTH(REPLACE(Attendees, ')', ''))>=numbers.n-1
where ltrim(SUBSTRING_INDEX(SUBSTRING_INDEX(Attendees, ')', numbers.n), ')', -1)) <> ''     
order by
  ExpRep, n

Примечание Было бы неплохо, чтобы один это пригодится вам, но в следующий раз добавьте тег используемой вами базы данных.

...