2016-02-11 47 views
5

我尝试创建只包含字符串的数据透视表。如何替换数据透视表中的NULL值?

这是我的表的简单版本:

CREATE TABLE SecurityGroup (GroupName VARCHAR(20), SecLevel VARCHAR(20),  Power VARCHAR(20)) 
INSERT INTO SecurityGroup 
SELECT 'GroupA','Level1','read' 
UNION 
SELECT 'GroupA','Level2','write' 
UNION 
SELECT 'GroupA','Level3','read' 
UNION 
SELECT 'GroupA','Level4','read' 
UNION 
SELECT 'GroupA','Level4','write' 

我想使用旋转功能得到以下结果集

期望

GroupName Level1 Level2 Level3 Level4 
GroupA  read  write  read  read 
GroupA  read  write  read  write 

我的问题是Level1 - Level3的值只存在1次,而Level4有2个不同的值。所以,我一直都想与此ResultSet:

现实

GroupName Level1 Level2 Level3 Level4 
GroupA  read  write  read  read 
GroupA  NULL  NULL  NULL  write 

我使用这个代码

SELECT 
[GroupName], 
[Level1], 
[Level2], 
[Level3], 
[Level4] 
FROM 
(SELECT 
[GroupName], 
[SecLevel], 
[Power], 
ROW_NUMBER() OVER(PARTITION BY [GroupName], [SecLevel] ORDER BY [Power]) AS rn 
FROM [SecurityGroup]) AS SourceTable 
PIVOT 
(MAX([Power]) 
    FOR [SecLevel] 
    IN ([Level1], [Level2], [Level3], [Level4]) 
) AS PivotTable 

任何想法如何解决这一问题?我无法在源表中为Level1 - Level3添加更多值。

我已经尝试使用RANK()而不是ROW_NUMBER(),但它没有奏效。

感谢您的帮助。

+0

写的痛苦,但我的想法是使用CTE或临时表,其中您为Level1 - Level3添加值,然后从CTE而不是表中选择。实际的表格不需要改变。应该有更优雅的东西,但我没有提出。 –

+0

看着输入结果集您的PIVOT正在返回正确的结果!你基本上有两个不同的组,尽管它们都被命名为GroupA。其中一个具有所有4个级别的值,另一个只具有级别4. –

+0

btw,为什么您要生成RowNumber而不是在任何地方使用它? –

回答

2
SELECT 
[GroupName], 
MAX([Level1]) OVER (PARTITION BY [GroupName]) [Level1], 
MAX([Level2]) OVER (PARTITION BY [GroupName]) [Level2], 
MAX([Level3]) OVER (PARTITION BY [GroupName]) [Level3], 
[Level4] 
FROM 
(SELECT 
[GroupName], 
[SecLevel], 
[Power], 
ROW_NUMBER() OVER(PARTITION BY [GroupName], [SecLevel] ORDER BY [Power]) AS rn 
FROM [SecurityGroup]) AS SourceTable 
PIVOT 
(MAX([Power]) 
    FOR [SecLevel] 
    IN ([Level1], [Level2], [Level3], [Level4]) 
) AS PivotTable; 
+0

非常感谢!这个版本工作。 –