2013-04-15 73 views
0

我有兩個表,我需要在一個表中列出一個工作人員列表和同一個公司的所有客戶端水平,最多可以有50個客戶端SQL Server:如何連接兩個表並水平旋轉第二個表

表之一:

Company_id staff name email 
1  John  [email protected] 
1  Mandy  [email protected] 
2  Jane  [email protected] 
3  Andy  [email protected] 

表二:

Company_id client name client class 
1  a  02 
2  ss  01 
2  d  08 

結果表:

Company_Id staff name email   client 1 client 2 client3 ….. clientX 
1  John  [email protected]  a(02) 
1  Mandy  [email protected] a(02) 
2  Jane  [email protected]  ss(01) d(08) 
+0

歡迎StackOverflow上:如果您發佈的代碼,XML或數據樣本,** **請在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以便對其進行精確格式化和語法突出顯示! –

回答

2

嘗試這一個 -

CREATE TABLE dbo.staff 
(
     company_id INT 
    , staff_name NVARCHAR(50) 
    , email NVARCHAR(50) 
) 

INSERT INTO dbo.staff (company_id, staff_name, email) 
VALUES 
    (1, 'John', '[email protected]'), 
    (1, 'Mandy', '[email protected]'), 
    (2, 'Jane', '[email protected]'), 
    (3, 'Andy', '[email protected]') 

CREATE TABLE dbo.client 
(
     company_id INT 
    , client_id INT 
    , client_name NVARCHAR(50) 
    , client_class NVARCHAR(50) 
) 

INSERT INTO dbo.client (company_id, client_id, client_name, client_class) 
VALUES 
    (1, 1, 'a', '02'), 
    (2, 2, 'ss', '01'), 
    (2, 3, 'd', '08') 

DECLARE 
     @Cols NVARCHAR(MAX) 
    , @SQL NVARCHAR(MAX) 

SELECT @Cols = 
    STUFF((
     SELECT DISTINCT ',' + QUOTENAME(c.client_id) 
     FROM dbo.client c 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
    , 1 , 1, '') 

SELECT @SQL = ' 
SELECT s.staff_name, s.email, d.* 
FROM (
    SELECT 
      company_id 
     , ' + @Cols + ' 
    FROM (
     SELECT name = client_name + ''('' + client_class + '')'', client_id, company_id 
     FROM dbo.client 
    ) x 
    PIVOT 
    (
     MAX(name) 
     FOR client_id IN (' + @Cols + ') 
    ) p 
) d 
JOIN dbo.staff s ON s.company_id = d.company_id 
' 

EXEC sys.sp_executesql @SQL 

SELECT s.company_id 
    , s.staff_name 
    , s.email 
    , c.clients 
FROM dbo.staff s 
OUTER APPLY (
    SELECT clients = STUFF((
     SELECT N', ' + c.client_name + '(' + c.client_class + ')' 
     FROM dbo.client c 
     WHERE c.company_id = s.company_id 
     FOR XML PATH(N''), TYPE, ROOT).value(N'root[1]', N'NVARCHAR(MAX)'), 1, 2, '') 
) c 
WHERE c.clients IS NOT NULL 

Result Window

+0

謝謝,優秀的第一個作品,第二個不能讓它運行 – smayshar