2017-02-09 32 views
0

这是我知道的一个受欢迎的问题。我只是了解数据透视表,不知道我哪里出错。SQL Server数据透视表,空值结果

create table #test 
(
    id varchar(4), 
    code varchar(2), 
    received_dt varchar(8) 
) 

insert into #test values ('1234','10','20150312') 
insert into #test values ('1234','71','20150312') 
insert into #test values ('1234','C5','20150312') 
insert into #test values ('4321','10','20150312') 
insert into #test values ('4321','71','20150312') 
insert into #test values ('987','10','20150312') 
insert into #test values ('987','71','20150312') 
insert into #test values ('987','C5','20150312') 

select id, [code1], [code2], [code3] 
from #test 
pivot(MAX(code) for code in ([code1], [code2], [code3])) as pvt 

drop table #test 

任何帮助/指导,非常感谢。我知道这应该很容易,但我似乎无法围绕它围绕我的大脑。

结果:

ID  Code1 Code2 Code3 
1234 NULL NULL NULL 
4321 NULL NULL NULL 
987  NULL NULL NULL 

旺旺:

ID  Code1 Code2 Code3 
1234 10  71  C5 
4321 10  71  NULL 
987  10  71  C5 

编辑有很多代码值。

+0

你真的应该发布结果,你想得到 – Lamak

+0

感谢只有我张贴后才实现。 – GibralterTop

回答

3

你需要创建一个包含Code1, Code2, Code3值的另一列:

;WITH CTE AS 
(
    SELECT *, 
      RN = 'Code' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test 
) 
SELECT id, [code1], [code2], [code3] 
FROM CTE 
PIVOT(MAX(code) for RN in ([code1], [code2], [code3])) as pvt; 

UPDATE

如果你有数目不详的代码,你需要动态SQL:

DECLARE @sql NVARCHAR(MAX) = N'', @cols NVARCHAR(MAX) = N''; 

WITH CTE AS 
(
    SELECT *, 
      RN = 'Code' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test 
) 
SELECT @cols += STUFF((SELECT ',' + QUOTENAME(RN) 
         FROM CTE 
         GROUP BY RN 
         FOR XML PATH('')), 1, 1, ''); 


SET @sql = N' 
SELECT * 
FROM ( SELECT *, 
       RN = ''Code'' + 
       CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY code) AS CHAR(1)) 
    FROM #test) AS d 
PIVOT(MAX(code) for RN in (' + @cols + ')) AS p;'; 

EXEC sp_executesql @sql; 
+0

动态部分是对我来说有什么窍门。非常感谢! – GibralterTop