2016-03-09 41 views
0

代理商可能有許多聯繫人。爲每個加入的記錄創建一個新列

Agency 

id int 
name nvarchar(100) 

Contact 

id int 
email nvarchar(100) 
agency_id int 

你會如何做一個存儲過程,它返回一個包含每個機構及其一行聯繫人一個結果?讓我們說你有一個機構有三個聯繫人,就結了。

----------------------------------------------------------------- 
| agency_name | contact_1  | contact_2  | contact_3  | 
|---------------------------------------------------------------| 
| Foo   | [email protected] | [email protected] | [email protected] | 
----------------------------------------------------------------- 

很明顯,您需要計算機構可能擁有的加入聯繫人的最大金額。

回答

0

試試下面的查詢:

DECLARE TABLE #temp(name nvarchar(MAX), email nvarchar(MAX), ranking int) 
DECLARE @qu NVARCHAR(MAX), @pcol NVARCHAR(MAX) 


INSERT INTO #temp 
SELECT 
    A.name AS name, 
    C.email AS email, 
    ROW_NUMBER() OVER (PARTITION BY name ORDER BY email ASC) AS ranking 
FROM Agency A LEFT JOIN Contact C ON A.id=C.agency_id 


SELECT 
@pcol= COALESCE(@pcol + ',','') + ContactNumber 
FROM 
(
    SELECT 
     DISTINCT N'Contact'+ CAST (ranking AS NVARCHAR(25)) AS ContactNumber 
    FROM #temp 
) A 

SET @qu=N'SELECT Name,'+ @pcol + 
N'FROM 
    (
     SELECT 
      Name, 
      N''Contact''+ CAST (ranking AS NVARCHAR(25)) AS ContactNumber, 
      email 
     FROM #temp 
    )S 
    PIVOT 
    (MAX(email) FOR ContactNumber IN ('[email protected] +N')) AS piv' 
EXEC sp_executesql @qu 
DROP TABLE #temp 
0

如果你總是想顯示3列,你不會有比這更,您可以使用CTEwindow function,而不是創建一個動態查詢

;WITH C AS(
    SELECT RANK() OVER (PARTITION BY name ORDER BY Email) AS [Rank] 
      ,b.id, b.name, Email 
    FROM @Contact AS a 
    INNER JOIN @Agency AS b ON a.agency_id = b.id 
) 
SELECT name 
    ,MIN(CASE C.[Rank] WHEN 1 THEN Email END) AS [Email1] 
    ,MIN(CASE C.[Rank] WHEN 2 THEN Email END) AS [Email2] 
    ,MIN(CASE C.[Rank] WHEN 3 THEN Email END) AS [Email3] 
FROM C 
GROUP BY name 
相關問題