2014-09-23 49 views
0

我在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 

我很感谢有人解决这个问题。

+2

@ user1459624 - “给我的代码” 的问题通常不深受社会各界的好评。您应该添加您尝试过的代码,并说明您遇到问题的位置。 – jww 2014-09-23 00:46:29

+0

每个供应商最多只能有三份合同吗? – radar 2014-09-23 00:54:53

+0

通过[SQLFiddle] http://www.sqlfiddle.com/ – Horaciux 2014-09-23 01:04:30

回答

0

试试这个,

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) 

SQL DEMO

+0

也提供模式和数据示例嗨谢谢您的回复.my coontractid是一个10位数字,它不像CTR01,CTR02 ... – 2014-09-23 15:02:32