Sql 如何基于多个分组获取计数

Sql 如何基于多个分组获取计数,sql,sql-server-2012,Sql,Sql Server 2012,我正试图找到获取这些计数的最简单方法 表结构 GroupId、EventId、UserId、TypeId 100, 1, 1, 1 100, 2, 1, 1 100, 1, 1, 0 100, 1, 3, 0 101,1,1,1 组有一个1对多的with事件。 1-n个事件可以链接到一个组 1组计数,其中用户1是typeid 1的唯一用户,每个组可以有多个事件,所有事件都必须是类型1 2当用户1是typeid 0的唯一用户时,每个组可以有多个事件,所有事件都必须是类型0 3当用户1不是typei

我正试图找到获取这些计数的最简单方法

表结构

GroupId、EventId、UserId、TypeId 100, 1, 1, 1 100, 2, 1, 1 100, 1, 1, 0 100, 1, 3, 0 101,1,1,1

组有一个1对多的with事件。 1-n个事件可以链接到一个组

1组计数,其中用户1是typeid 1的唯一用户,每个组可以有多个事件,所有事件都必须是类型1

2当用户1是typeid 0的唯一用户时,每个组可以有多个事件,所有事件都必须是类型0

3当用户1不是typeid 1的唯一用户时,每个组可以有多个事件,所有事件都必须是类型1


4当用户1不是typeid 0的唯一用户时,组计数可以是每个组的多个事件,所有事件都必须是类型0

您可以在解决此问题时使用countcase

select count(case when t2.cn=1 and t1.UserId = 1 and t1.TypeId =1 then 1 else null end) as case1,
       count(case when t2.cn=1 and t1.UserId = 1 and t1.TypeId =0 then 1 else null end) as case2,
       count(case when t2.cn>1 and t1.UserId = 1 and t1.TypeId =1 then 1 else null end) as case3,
       count(case when t2.cn>1 and t1.UserId = 1 and t1.TypeId =1 then 1 else null end) as case4
 from table1 t1
 join (select count(distinct UserId) as cn, TypeId, from table) t2
 on  t1.TypeId = t2.TypeId

在countcase中,当您选择1表示它将计数时,null将不被计数。因此,您只需计算出它应该计数的大小写即可。

我想这就是我需要的,但如何计算每个groupid?@user3953989您的意思是表中有相同的groupid、相同的userid、相同的typeid但不同的eventid?现在在本例中,由于eventId是不相关的,所以可以在执行查询之前剪切重复的数据。所以在我上面的脚本中,您需要更改t1表,比如选择不同的groupid、userid。。。从表1中,我将尝试现在,但是的,一个组可能有30多个与每个事件相关联的不同用户的事件。我需要知道有多少组只有用户1事件,有多少组有不同用户的事件。即,组10有20个事件,所有20个事件都与用户1关联。我需要在第一个案例中计算这一组。如果任何事件有不同的用户,则在第3种情况下,这将计算在内。对于类型=1@user3953989这与你问的情况大不相同,但解决办法是一样的。如果您有任何问题,您可以查看countcase何时可以查看更多内容