Sql 基于单列的多列透视
我的SQL Server 2008 R2中有下表Sql 基于单列的多列透视,sql,sql-server,Sql,Sql Server,我的SQL Server 2008 R2中有下表 Provider ContractID Department StDate EndDate ======================================================== 10001 CTR456 IT 1/1/2012 12/1/2014 10001 CT346 Account 4/1/2014 9/
Provider ContractID Department StDate EndDate
========================================================
10001 CTR456 IT 1/1/2012 12/1/2014
10001 CT346 Account 4/1/2014 9/9/2014
10002 CT88R01 IT 2/1/2012 2/1/2013
10003 C23TR01 IT 3/2/2012 1/1/2099
10003 C4TR02 Health 3/2/2012 1/1/2099
10003 CT56R03 Security 3/2/2012 1/1/2099
如何使用Pivot或任何其他方法实现以下输出
Provider Contract1 Dept1 StDt1 EndDt2 Contract2 Dept2 StDate2 EndDt2 Contract3 Dept3 StDate3 EndDt3
=====================================================================================================
10001 CTR456 IT 1/1/12 12/1/14 CT346 Accont 4/1/14 9/9/14 NULL NULL NULL NULL
10002 CT88R01 IT 1/1/12 12/1/14 NULL NULL NULL NULL NULL NULL NULL NULL
10003 C23TR01 IT 1/1/12 12/1/14 C4TR02 Health 3/2/14 1/1/99 CT56R03 Secu 3/2/14 1/1/99
如果有人能解决这个问题,我将不胜感激。试试这个
DECLARE @sql varchar(max)
DECLARE @colList varchar(max)
--create dynamic list of columns
SELECT @colList =
STUFF
(
(
SELECT + ',' +
quotename(colName + CAST(CAST(REPLACE(ContractID,'CTR','') AS INTEGER) AS VARCHAR))
FROM Tab1
CROSS APPLY
(
SELECT 1 As Ord, 'Contract' ColName UNION ALL
SELECT 2 As Ord, 'Dept' UNION ALL
SELECT 3 As Ord, 'StDt' UNION ALL
SELECT 4 As Ord, 'EndDt'
) v
GROUP BY colName,Ord, CAST(CAST(REPLACE(ContractID,'CTR','') AS INTEGER) AS VARCHAR)
ORDER BY CAST(CAST(REPLACE(ContractID,'CTR','') AS INTEGER) AS VARCHAR), Ord
for xml path(''), type
).value('/','varchar(max)'),1,1,''
)
--unpivot columns into rows and then apply pivot
SET @sql
= '
SELECT Provider, ' + @colList + '
FROM
(
SELECT Provider, ColVal,
colName + CAST(CAST(REPLACE(ContractID,''CTR'','''') AS INTEGER) AS VARCHAR) ColName
FROM Tab1
CROSS APPLY
(
SELECT ContractId As ColVal, ''Contract'' ColName UNION ALL
SELECT Department, ''Dept'' UNION ALL
SELECT CAST(StDate AS VARCHAR), ''StDt'' UNION ALL
SELECT CAST(EndDate AS VARCHAR), ''EndDt''
) v
) A
PIVOT
(
MAX(ColVal) FOR ColName IN (' + @colList + ')
) P1 '
EXEC(@sql)
@user1459624-“给我代码”问题通常不会受到社区的欢迎。您应该添加您尝试过的代码,并说明您遇到的问题。每个提供商最多只能签订三份合同吗?还可以通过[SQLFiddle]提供架构和数据示例。您好,谢谢您的回复。我的Coontracid是一个10位数字,与CTR01、CTR02不完全一样。。。