t-sql запрос для объединения соответствующих строк - PullRequest
4 голосов
/ 02 июня 2011

У меня есть стол Managers.Столбцы: ManagerId, ManagerName.

У меня есть таблица Clients.Столбцы: ClientId, ManagerId, ClientName, ClientAddress, Details.

У каждого (каждого?) Менеджера есть клиенты в таблице клиентов.

Мне нужен запрос, который возвращает следующую таблицу.Столбцы: Столбец1, Столбец2.

Столбец1: ManagerName

Столбец2: ClientName1 ',' ClientAddress1 ',' Details1 ';' ClientName2 ',' ClientAddress2 ',' Details2 ';' etc

В столбце 2 просто список клиентов, соответствующих менеджеру из столбца 1.

Как я могу это сделать?

Наверное, мне нужно использовать COALESCE, но я не уверен.

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

То же, что и в предыдущих ответах, с добавлением обработки нулевых значений и специальных символов XML <>&'".

declare @Managers table
(
  ManagerId int,
  ManagerName varchar(50)
)

declare @Clients table
(
  ClientId int,
  ManagerId int,
  ClientName varchar(50),
  ClientAddress varchar(50),
  Details varchar(50)
)

insert into @Managers values(1, 'Manager 1')
insert into @Managers values(2, 'Manager 2')

insert into @Clients values (1, 1, 'Client 1',   'CA 1', 'D 1')
insert into @Clients values (2, 1, 'Client 2',   'CA 2', 'D 2')
insert into @Clients values (3, 2, 'XML special characters &<>" and null values', null,  'D 3')

select M.ManagerName,
       stuff((select '; '+
                     coalesce(C.ClientName, '')+', '+
                     coalesce(C.ClientAddress, '')+', '+
                     coalesce(C.Details, '')
              from @Clients as C 
              where C.ManagerId = M.ManagerId
              for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '') as Clients
from @Managers as M

Результат:

ManagerName  Clients
-----------  ---------------------------------------------------
Manager 1    Client 1, CA 1, D 1; Client 2, CA 2, D 2
Manager 2    XML special characters &<>" and null values, , D 3
1 голос
/ 02 июня 2011
SELECT 
    ManagerName,
    (
        SELECT ClientName + ', ' + ClientAddress + ', ' + Details + ' ; '
        FROM Clients c
        WHERE c.ManagerId = m.ManagerId
        FOR XML PATH ('')
    ) AS clients
FROM Managers m
1 голос
/ 02 июня 2011

Вот рабочий пример использования XML AUTO

With Managers AS
(
      Select 1 as ManagerId, 'Tom' as ManagerName
UNION Select 2 as ManagerId, 'Jane' as ManagerName
),
Clients as
(
      Select 1 as ClientId, 1 as ManagerId, 'TaXon Pro' as ClientName, '112 Acme St Cityville DD 56' as ClientAddress, 'ABC' as Details
UNION Select 2 as ClientId, 1 as ManagerId, 'Pro Xon' as ClientName, '12342 Bylo Rd Streetville DD 156' as ClientAddress, 'CDR' as Details
UNION Select 3 as ClientId, 1 as ManagerId, 'Clean Svc' as ClientName, '6512 Toni St Townville DD 1236' as ClientAddress, 'D@#$' as Details
UNION Select 4 as ClientId, 2 as ManagerId, 'ContraRel' as ClientName, '152 Acme St Villageville DD 3456' as ClientAddress, 'SER' as Details
UNION Select 5 as ClientId, 2 as ManagerId, 'RepoIn' as ClientName, '1 Acme St Districtville DD 1456' as ClientAddress, 'KH' as Details
)
SELECT 
    M.ManagerName,
    (
        SELECT c.ClientName + ', ' + C.ClientAddress + ', ' + c.Details + ';'
        FROM Clients C
        WHERE m.ManagerId = c.ManagerId
        FOR XML PATH('') 
    ) AS Clients
FROM Managers M
GROUP BY 
    m.ManagerId, M.ManagerName

Результат будет выглядеть так

ManagerName Clients
----------- -------------------------------------------------------------------------------------------------------------------------------------------
Tom         TaXon Pro, 112 Acme St Cityville DD 56, ABC;Pro Xon, 12342 Bylo Rd Streetville DD 156, CDR;Clean Svc, 6512 Toni St Townville DD 1236, D@#$;
Jane        ContraRel, 152 Acme St Villageville DD 3456, SER;RepoIn, 1 Acme St Districtville DD 1456, KH;

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