SQL组用户,如果他们属于一个或多个组

时间:2018-05-25 09:02:59

标签: sql sql-server

我想计算独有的用户,这些用户只拥有Bucket A,Bucket B或Bucket A和B.我的表看起来像这样:

DateKey User Bucket
05-18   1   A
05-18   1   B
05-18   2   B
05-18   3   A
05-18   4   A
05-18   4   A
04-18   1   A
04-18   1   B
04-18   2   B
04-18   3   A
04-18   4   A
04-18   4   A

在此处获取结构http://sqlfiddle.com/#!18/45a36/1

我想要的结果就是这样:

DateKey Bucket UniqueUsers
05-18   A      2
        B      1
        A+B    1
04-18   A      2
        B      1
        A+B    1

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

请参阅:http://sqlfiddle.com/#!18/45a36/11

select DateKey
, max(case 
    when IsA = 1 and IsB = 0 then 'A' 
    when IsA = 0 and IsB = 1 then 'B' 
    when IsA = 1 and IsB = 1 then 'A+B' 
  end) Bucket 
, count(distinct [User]) UniqueUsers
from
(
  select DateKey
  , [User]
  , max(case when bucket = 'A' then 1 else 0 end) IsA
  , max(case when bucket = 'B' then 1 else 0 end) IsB
  from table1
  group by DateKey, [User]
) x
group by DateKey, IsA, IsB
order by DateKey, IsA + (IsB * 2)  

我们的子查询将每个用户/日期键压缩到一行,并用列表示是否有A和/或B的值。

然后,我们可以按DateKeyIsAIsB对这些行进行分组,将每个DateKey值和IsA的每个组合压缩为1行和IsB1, 00, 11, 1; 0, 0不存在,因为这将要求table1中没有行,这样就不会产生结果。

最后,我们计算每个组中不同用户的数量。

注意:订单只是获取A, B, A+B ...即我已经做到(1,0) = 1,(0,1) = 2,{{1} } = 3.

答案 1 :(得分:0)

如果你只有两个桶,我会这样做:

select DateKey, buckets, count(*) as  UniqueUsers
from (select DateKey, [User],
             (case when min(bucket) <> max(bucket)
                   then min(bucket) + '+' + max(bucket)
                   else min(bucket)
              end) as buckets
      from table1 t
      group by DateKey, [User]
     ) t
group by DateKey, buckets
order by DateKey, len(buckets), buckets;

Here是SQL小提琴。