2016-02-11 31 views
5

Tôi cố gắng tạo bảng tổng hợp chỉ bao gồm các chuỗi.cách thay thế giá trị NULL trong bảng tổng hợp?

Đây là một phiên bản đơn giản của bàn của tôi:

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' 

Tôi muốn sử dụng chức năng PIVOT để có được những ResultSet sau

vọng

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

Tôi có vấn đề là các giá trị cho Level1 - Level3 chỉ tồn tại 1 lần, trong khi Level4 có 2 giá trị khác nhau. Vì vậy, tôi luôn nhận được ResultSet này:

Reality

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

Tôi đang sử dụng mã này

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 

Bất kỳ ý tưởng làm thế nào để sửa lỗi này? Tôi không thể thêm nhiều giá trị hơn cho Level1 - Level3 trong bảng nguồn.

Tôi đã cố gắng sử dụng RANK() thay vì ROW_NUMBER() nhưng nó không hoạt động.

Cảm ơn sự giúp đỡ của bạn.

+0

Một nỗi đau để viết, nhưng ý tưởng của tôi là sử dụng bảng CTE hoặc tạm thời mà bạn thêm giá trị cho Level1 - Level3, sau đó chọn từ CTE thay vì bảng. Bảng thực tế không cần phải thay đổi. Có phải là một cái gì đó thanh lịch hơn, nhưng tôi không đến với nó. –

+0

xem kết quả đầu vào đã đặt PIVOT của bạn đang trả lại kết quả chính xác! về cơ bản bạn có hai nhóm khác nhau mặc dù cả hai đều được đặt tên là GroupA. người ta có một giá trị cho tất cả 4 cấp độ và một chỉ có cho cấp 4. –

+0

btw, tại sao bạn tạo ra một RowNumber và không sử dụng nó ở bất cứ đâu? –

Trả lời

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

Cảm ơn bạn rất nhiều! Phiên bản này đã hoạt động. –

Các vấn đề liên quan