【问题标题】:SQL Server group by ID & dynamic Pivot/Transpose attributesSQL Server 按 ID 和动态 Pivot/Transpose 属性分组
【发布时间】:2018-05-23 04:45:03
【问题描述】:

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

我试图说明您需要前往的所有商店才能完成一个食谱,给定一张表格,其中包含每种成分的供应商列表。

当前成分表:

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

【问题讨论】:

    标签: sql sql-server pivot dynamic-sql unpivot


    【解决方案1】:

    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)
    

    【讨论】:

    • 嘿伙计,这太棒了!如果在 N 没有上限的情况下我无法得到任何答案,我会将其标记为答案!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2012-05-11
    相关资源
    最近更新 更多