例如,我有一个表,其中的一列中有一个Customers列表(只是他们的ID),而另一列中有一个他们喜欢的艺术家列表;
12345 Creed
12345 Evanescence
12345 Linkin Park
22556 Creed
22556 Foo Fighters
33485 Foo Fighters
我使用动态列标题(针对Artist)创建了Pivot,因为虽然有一个供他们选择的设置列表,但是它可能会改变,我不想每次都更新代码改变(我想要和我们所有人一样的轻松生活!)
我希望数据透视表显示的是每个客户1行,以显示他们喜欢的艺术家。
但是,当我运行以下PIVOT时,对于列出了1个以上艺术家的那些客户,每个客户的结果将返回多于1行,如下所示:
CustomerID Creed Evanescence Foo Fighters Linkin Park
12345 Creed
12345 Evanescence
12345 Linkin Park
22556 Creed
22556 Foo Fighters
33485 Foo Fighters
我想要什么:
CustomerID Creed Evanescence Foo Fighters Linkin Park
12345 Creed Evanescence Linkin Park
22556 Creed Foo Fighters
33485 Foo Fighters
T-SQL
--Declare variables
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME([Artist])
FROM (SELECT DISTINCT [Artist] FROM ##TEMP_CustomerWithArtists) AS Artists
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT DISTINCT CustomerID, ' + @ColumnName + '
FROM ##TEMP_CustomerWithArtists
PIVOT(MAX(Artist)
FOR [Artist] IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
答案 0 :(得分:0)
外部查询中不需要.lstrip()
。
当基础表具有其他列时,会发生此问题。您什么也没有提及,不过请尝试以下方法:
SELECT DISTINCT
此行为是我不喜欢SET @DynamicPivotQuery = N'
SELECT CustomerID, ' + @ColumnName + '
FROM (SELECT DISTINCT CustomerID, Artist
FROM ##TEMP_CustomerWithArtists cwa
) cwa
PIVOT(MAX(Artist)
FOR [Artist] IN (' + @ColumnName + ')
) AS PVTTable';
语法的原因之一。