2011-06-02 50 views
4

我有一個表Managers。欄目:ManagerId, ManagerNamet-sql查詢連接相應的行

我有一個表Clients。欄目:ClientId, ManagerId, ClientName, ClientAddress, Details

每個(每個?)經理在客戶表中都有客戶。

我需要一個返回下一個表的查詢。列:Column1,Column2。

列1:ManagerName

列2:ClientName1 ',' ClientAddress1 ',' Details1 ';' ClientName2 ',' ClientAddress2 ',' Details2 ';' etc

在COLUMN2只是對應於經理從COLUMN1客戶名單。

我該怎麼做?

我想我需要使用COALESCE,但我不確定。

回答

1

下面是使用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, '[email protected]#$' 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, [email protected]#$; 
Jane  ContraRel, 152 Acme St Villageville DD 3456, SER;RepoIn, 1 Acme St Districtville DD 1456, KH; 

(2 row(s) affected) 
1
SELECT 
    ManagerName, 
    (
     SELECT ClientName + ', ' + ClientAddress + ', ' + Details + ' ; ' 
     FROM Clients c 
     WHERE c.ManagerId = m.ManagerId 
     FOR XML PATH ('') 
    ) AS clients 
FROM Managers m 
2

同與除了處理空值和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