为了简单起见,我们假设一群受邀嘉宾访问我的网站,以回复派对并选择一顿饭。他们可以从可用物品清单中选择盘子上的每个物品,因此一个客人可以请求3个物品,另一个可以请求5个或其他数量。
在RSVP截止日期,派对组织者会收到每份订购餐点及其数量组合的清单。例如:
(5x)牛排,土豆泥,巧克力蛋糕
(3x)烤鸡,鱼种土豆,cobb沙拉,白面包卷,奶油布丁
受邀嘉宾选择的每个项目都在 Items 表中表示为自己的行。每个唯一的InviteId代表一个人的选择,因此在下面的示例数据中,一个人选择了3个itema而另一个人想要5个:
我希望编写一个查询/视图/存储过程来生成所有可能组合的计数。我最初朝着制作带有位列的临时表的方向前进,以代表36种可能的选择中的每一种,但即便如此我也不确定如何完成它。任何帮助将不胜感激!
答案 0 :(得分:1)
这在SQL Server中有点痛苦(直到最新版本)。您可以通过执行以下操作将项目聚合在一起:
select i.inviteid,
stuff( (select ',' + cast(i2.requesteditemid)
from items i2
where i2.inviteid = i.inviteid
order by i2.requreditemid
for xml path ('')
), 1, 1, ''
) as items
from (select distinct inviteid from items i) i;
然后,您可以获得具有额外聚合级别的列表:
with ii as (
select i.inviteid,
stuff( (select ',' + cast(i2.requesteditemid)
from items i2
where i2.inviteid = i.inviteid
order by i2.requreditemid
for xml path ('')
), 1, 1, ''
) as items
from (select distinct inviteid from items i) i
)
select items, count(*)
from ii
group by items;
这会在列表中生成项ID - 这是您问题中实际提供的唯一数据。如果你想要项目的名称,你需要注意项目名称中没有逗号(以防止歧义)。 order by
也非常重要。 。 。因为您希望1,2,3
与3,2,1
匹配。