Разделение строк, фильтрация столбцов в новые столбцы и объединение - PullRequest
0 голосов
/ 25 сентября 2019

Я должен извлечь значение 'Lab' из ParLab в TableA.Мне нужна помощь с фильтрацией только по кодам из «Lab», которые начинаются с «L», и из «Mcode», которые соответствуют.

 TableA

 ParLab Mcode   Entry
 L;58   9LL     948487
 L;58   2AN     e@y.com
 L;80   9LL     938745
 L;58   3B2     563467
 T;80   2AN     d@g.com
 T;88   9LL     827120
 T;88   9LL     k@g.com
 A;47;2 2AN     928233
 L;80   2AN     d@m.com

Затем мне нужно присоединиться к «Lab» из таблицы B со значениями, отделенными от строки ParLab, которые соответствуют «Lab».

  TableB

   Lab        Customer
   58         Lynn
   80         Laurence
   88         Emmanuel

Результат должен содержать Tel иЭлектронная почта (объединенная, если существует более одного значения из TableA) в разных столбцах, назначенных для «Lab», и Customer присоединяется к TableB в «Lab».

 Customer   Lab Tel               Email
 Lynn       58  948487, 563467    e@y.com
 Laurence   80  938745            d@g.com, d@m.com
 Emmanuel   88  827120            k@g.com

Это отличие от предыдущего сообщения, в которомФильтр предназначен только для некоторых значений Mcode для одного и того же клиента.

Разделение строк и фильтрация столбцов по новым столбцам

Спасибо за терпение и помощь!

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Проверьте этот другой метод-

IF OBJECT_ID('[TableA]') IS NOT NULL
    DROP TABLE TableA

CREATE TABLE TableA ( 
   ParLab varchar(10), 
   Mcode varchar(50),  
   Entry varchar(50)
)

INSERT INTO TableA
   (ParLab, Mcode, Entry)
VALUES   
   ('L;58',   '9LL', '948487'),
   ('L;58',   '3B2', '563467'),
   ('L;58',   '2AN', 'e@y.com'),
   ('L;80',   '9LL', '938745'),
   ('T;80',   '2AN', 'd@g.com'),
   ('T;88',   '9LL', '827120'),
   ('L;80',   '2AN', 'd@m.com'),
   ('T;88',   '9LL', 'k@g.com'),
   ('A;47;2', '2AN', '928233')

IF OBJECT_ID('[TableB]') IS NOT NULL
    DROP TABLE TableB

CREATE TABLE TableB ( 
   Customer varchar(50), 
   Lab varchar(50)
)

INSERT INTO TableB
   (Customer, Lab)
VALUES   
   ('Lynn'   ,  58),
   ('Laurence', 80),
   ('Emmanuel', 88)

select c.customer,c.lab,
string_agg(case when charindex('@',p.entry)=0 then p.entry end,', ') as Tel,
string_agg(case when charindex('@',p.entry)>0 then p.entry end,', ') as Email
from TableA as p
inner join TableB as c
on ';' + p.[ParLab] +';' LIKE '%;' + cast(c.Lab as varchar) + ';%'
group by c.customer,c.lab
1 голос
/ 25 сентября 2019

Один из возможных подходов - использовать функции STRING_SPLIT() и STRING_AGG() для разделения ParLab значений и агрегирования данных:

Таблица:

CREATE TABLE TableA ( 
   ParLab varchar(10), 
   Mcode varchar(50),  
   Entry varchar(50)
)
INSERT INTO TableA
   (ParLab, Mcode, Entry)
VALUES   
   ('L;58',   '9LL', '948487'),
   ('L;58',   '3B2', '563467'),
   ('L;58',   '2AN', 'e@y.com'),
   ('L;80',   '9LL', '938745'),
   ('T;80',   '2AN', 'd@g.com'),
   ('T;88',   '9LL', '827120'),
   ('L;80',   '2AN', 'd@m.com'),
   ('T;88',   '9LL', 'k@g.com'),
   ('A;47;2', '2AN', '928233')
CREATE TABLE TableB ( 
   Customer varchar(50), 
   Lab varchar(50)
)
INSERT INTO TableB
   (Customer, Lab)
VALUES   
   ('Lynn'   ,  58),
   ('Laurence', 80),
   ('Emmanuel', 88) 

Оператор:

SELECT 
   b.Customer,
   b.Lab,
   STRING_AGG(CASE WHEN CHARINDEX('@', Entry) = 0 THEN Entry END, ',') AS Tel,
   STRING_AGG(CASE WHEN CHARINDEX('@', Entry) > 0 THEN Entry END, ',') AS Email
FROM TableA a
CROSS APPLY STRING_SPLIT(a.ParLab, ';') s
LEFT JOIN TableB b ON s.[value] = b.Lab
WHERE b.Customer IS NOT NULL
GROUP BY b.Customer, b.Lab 

Результаты:

Customer    Lab Tel             Email
Lynn        58  948487,563467   e@y.com
Laurence    80  938745          d@g.com,d@m.com
Emmanuel    88  827120          k@g.com

Примечания:

Функция STRING_SPLIT() доступна в SQL Server 2016, STRING_AGG() доступна в SQL Server 2017+.Функцию STRING_SPLIT() следует использовать осторожно, поскольку порядок возвращаемых строк не обязательно соответствует порядку подстрок во входной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...