2016-03-09 40 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 
相关问题