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个菜谱如下:
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)
我看到了一个动态 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个菜谱如下:
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)