Sql 基于单列的多列透视

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/

我的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/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不完全一样。。。