Если ваше значение равно NULL
, а не '<null>'
, то, похоже, вы получите то, что вам нужно:
CREATE TABLE dbo.SampleTable ([User] varchar(6), --I suggest a different name here, USER is a reserved keyword in T-SQL
Code varchar(4),
Used tinyint);
INSERT INTO dbo.SampleTable ([User],
Code,
Used)
VALUES ('user1','null',1),
('user2','abca',4),
('user2','null',2),
('userN','baaa',3);
GO
DECLARE @SQL nvarchar(MAX);
DECLARE @NL nchar(2) = NCHAR(13) + NCHAR(10)
SET @SQL = N'SELECT [User],' + @NL +
STUFF((SELECT N',' + @NL +
N' MAX(CASE WHEN Code = ' + QUOTENAME(Code,'''') + N' THEN Used END) AS ' + QUOTENAME(COALESCE(Code,'null'))
FROM dbo.SampleTable ST
GROUP BY ST.Code
ORDER BY ST.Code
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,10,N'') + @NL +
N'FROM dbo.SampleTable' + @NL +
N'GROUP BY [User];';
PRINT @SQL;
EXEC sp_executesql @SQL;
GO
DROP TABLE dbo.SampleTable;
Я изменил метод здесь, так как я предпочитаю создавать кросс-таблицу для сводных данных и не использовал переменную для получения значений столбцов.