代码之家  ›  专栏  ›  技术社区  ›  iLLy_Mays

按ID分组的SQL Server动态透视/转置属性(&D)

  •  2
  • iLLy_Mays  · 技术社区  · 7 年前

    我看到了一个与我的问题非常相似的动态SQL答案 here ,但我无法控制住这小小的变化,这将使我到达终点线。

    我试图举例说明为了完成一份食谱,你需要去的所有商店,给出一张表格,其中列出了每种配料的供应商名单。

    当前成分表:

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

    所需成分表(在分组和透视之后):

    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个) 这是一个更大查询的一部分,我希望最终将配料表连接回配方表,生成如下结果:

    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
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   DhruvJoshi    7 年前

    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)