2016-02-11 45 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

非常感謝!這個版本工作。 –