我有一个查询,该查询返回具有相关抵押名称的客户贷款,如以下(1)所示,但我想连续仅拥有一个不同的贷款编号,并且像其他示例(2)那样保留抵押名称。一直在进行透视,但由于我没有汇总列,也不知道要解决的原因,我也不知道每笔贷款可能没有多少抵押品。怎么做???在SQL Server 2012中可能吗?
谢谢
(1)
loanid|name |Address | 1 |John |New York| 1 |Carl |New York| 1 |Henry |Boston | 2 |Robert|Chicago | 3 |Joanne|LA | 3 |Chris |LA |
(2)我需要这样的东西
loanid|name |address |name |address |name|address| 1 |Jonh |New York |Carl |New York|Henry|Boston| 2 |Robert|Chicago | 3 |Joanne|LA |Chris|LA|
测试数据
DECLARE @TABLE TABLE (loanid INT,name VARCHAR(20),[Address] VARCHAR(20)) INSERT INTO @TABLE VALUES (1,'John','New York'),(1,'Carl','New York'),(1,'Henry','Boston'), (2,'Robert','Chicago'),(3,'Joanne','LA'),(3,'Chris','LA')
询问
SELECT loanid ,ISNULL(name1, '') AS name1 ,ISNULL(Address1, '') AS Address1 ,ISNULL(name2, '') AS name2 ,ISNULL(Address2, '') AS Address2 ,ISNULL(name3, '') AS name3 ,ISNULL(Address3, '') AS Address3 FROM ( SELECT loanid ,'name' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) AS Cols , name AS Vals FROM @TABLE UNION ALL SELECT loanid ,'Address' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) , [Address] FROM @TABLE ) t PIVOT (MAX(Vals) FOR Cols IN (name1, Address1,name2,Address2,name3,Address3) )P
结果集
╔════════╦════════╦══════════╦═══════╦══════════╦═══════╦══════════╗ ║ loanid ║ name1 ║ Address1 ║ name2 ║ Address2 ║ name3 ║ Address3 ║ ╠════════╬════════╬══════════╬═══════╬══════════╬═══════╬══════════╣ ║ 1 ║ John ║ New York ║ Carl ║ New York ║ Henry ║ Boston ║ ║ 2 ║ Robert ║ Chicago ║ ║ ║ ║ ║ ║ 3 ║ Joanne ║ LA ║ Chris ║ LA ║ ║ ║ ╚════════╩════════╩══════════╩═══════╩══════════╩═══════╩══════════╝
动态列更新
DECLARE @Cols NVARCHAR(MAX); SELECT @Cols = STUFF(( SELECT DISTINCT ', ' + QUOTENAME(Cols) FROM ( SELECT loanid ,'name' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) AS Cols , name AS Vals FROM @TABLE UNION ALL SELECT loanid ,'Address' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) , [Address] FROM @TABLE ) t GROUP BY QUOTENAME(Cols) FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,'') DECLARE @Sql NVARCHAR(MAX); SET @Sql = 'SELECT ' + @Cols + ' FROM ( SELECT loanid ,''name'' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) AS Cols , name AS Vals FROM @TABLE UNION ALL SELECT loanid ,''Address'' + CAST(ROW_NUMBER() OVER (PARTITION BY loanid ORDER BY loanid) AS NVARCHAR(10)) , [Address] FROM @TABLE ) t PIVOT (MAX(Vals) FOR Cols IN (' + @Cols + ') )P' EXECUTE sp_executesql @Sql
笔记
这将无法与我的答案中给定的示例数据一起使用,因为它使用表变量,并且由于它具有自己的作用域,因此对于动态sql不可见。但是此解决方案可以在普通的sql server表上使用。
同样,选择列的顺序也会略有不同。