SQL 按 ID 和动态 Pivot/Transpose 属性的服务器组

SQL Server group by ID & dynamic Pivot/Transpose attributes

我看到了一个动态 SQL 答案,它与我的问题 here 非常相似,但我无法理解可以让我到达终点线的小变化。

我正在尝试说明您为了完成食谱需要前往的所有商店,给定一个 table,其中包含每种成分的供应商列表。

当前成分Table:

RecipeId    Supplier
1           Store A
1           Store B
2           Store A
3           Store B
3           Store C
3           Store D

所需成分Table(分组和枢轴后):

RecipeId    Supplier 1      Supplier 2      Supplier 3
1           Store A         Store B         NULL
2           Store A         NULL            NULL
3           Store B         Store C         Store D

任何一个食谱都可以有零到无限的供应商(如果绝对需要,我可以将其限制在 10 个) 这是一个更大的查询的一部分,我希望最终将成分 table 加入到配方 table 中,产生如下内容:

RecipeId    Recipe Name     Supplier 1      Supplier 2      Supplier 3      Supplier N
1           Cookies         Store A         Store B         NULL            NULL
2           Cake            Store A         NULL            NULL            NULL
3           Pie             Store B         Store C         Store D         NULL

简单查询N个菜谱如下:

See working demo

 declare @q varchar(max), @cols varchar(max)
set @cols
     = STUFF((
          SELECT distinct ',' + 
               QUOTENAME('Supplier '+
                         cast(row_number()  over (partition by recipeid order by supplier ) as varchar(max))
                        ) 
            FROM Ingredient
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @q=
'select 
  recipeid,'+ @cols +
' from
(
    select 
       recipeid,
       Supplier, 
       ''Supplier ''+
         cast(row_number()  over (partition by recipeid order by supplier ) as varchar(max))  as r
    from 
       Ingredient 
)I
pivot
( 
    max(Supplier)   
    for r in ('+@cols+')
 )piv'

 exec(@q)