如何在MS SQL中查询唯一行组合的计数?

如何在MS SQL中查询唯一行组合的计数?,sql,sql-server,Sql,Sql Server,为了简单起见,让我们假设一组受邀的客人访问我的网站,参加一个聚会并选择一顿饭。他们可以从可用物品列表中选择盘子上的每一件物品,因此一位客人可以要求3件物品,另一位客人可以要求5件或其他数量的物品 在RSVP截止日期,向聚会组织者发送一份所订购的每种膳食组合及其数量的清单。例如: 5份牛排、土豆泥、巧克力蛋糕 3份烤鸡、鱼种土豆、科布沙拉、白面包卷、烤面包 受邀客人选择的每个项目在项目表中表示为其自己的行。每个唯一的InviteId代表一个人的选择,因此在下面的示例数据中,一个人选择了3个item

为了简单起见,让我们假设一组受邀的客人访问我的网站,参加一个聚会并选择一顿饭。他们可以从可用物品列表中选择盘子上的每一件物品,因此一位客人可以要求3件物品,另一位客人可以要求5件或其他数量的物品

在RSVP截止日期,向聚会组织者发送一份所订购的每种膳食组合及其数量的清单。例如:

5份牛排、土豆泥、巧克力蛋糕 3份烤鸡、鱼种土豆、科布沙拉、白面包卷、烤面包

受邀客人选择的每个项目在项目表中表示为其自己的行。每个唯一的InviteId代表一个人的选择,因此在下面的示例数据中,一个人选择了3个itema,另一个人想要5个:


我希望编写一个查询/查看/存储过程来生成所有可能组合的计数。我最初的方向是制作一个带有位列的临时表,以表示36个可能的选择中的每一个,但即使这样,我也不确定如何完成它。任何帮助都将不胜感激

在最新版本发布之前,这对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,这是您的问题中实际提供的唯一数据。如果需要项的名称,请注意项名称中没有逗号,以避免歧义。订单也很重要。因为您希望1,2,3与3,2,1匹配。

请将一些示例数据和预期结果以文本/DDL、DML的形式共享,请查看此链接以了解有关如何提问/改进问题的更多信息。对于我的特定数据情况,此链接与一些额外的连接非常有效。非常感谢。