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

时间:2017-11-22 13:17:49

标签: sql sql-server

为了简单起见,我们假设一群受邀嘉宾访问我的网站,以回复派对并选择一顿饭。他们可以从可用物品清单中选择盘子上的每个物品,因此一个客人可以请求3个物品,另一个可以请求5个或其他数量。

在RSVP截止日期,派对组织者会收到每份订购餐点及其数量组合的清单。例如:

(5x)牛排,土豆泥,巧克力蛋糕
(3x)烤鸡,鱼种土豆,cobb沙拉,白面包卷,奶油布丁

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

Sample data

我希望编写一个查询/视图/存储过程来生成所有可能组合的计数。我最初朝着制作带有位列的临时表的方向前进,以代表36种可能的选择中的每一种,但即便如此我也不确定如何完成它。任何帮助将不胜感激!

1 个答案:

答案 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,33,2,1匹配。