如何执行SQL透视将所有结果放在每条记录1行中?

时间:2019-05-26 19:09:28

标签: sql pivot

例如,我有一个表,其中的一列中有一个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

1 个答案:

答案 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'; 语法的原因之一。