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

标签 sql sql-server

我想计算拥有唯一存储桶 A、唯一存储桶 B 或同时拥有存储桶 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

谢谢您的帮助。

最佳答案

见: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)  

我们的子查询将每个用户/日期键压缩为 1 行,其中包含列以说明是否有 A 和/或 B 的值。

然后我们可以通过 DateKey 对这些行进行分组, IsAIsB将它们压成 1 行 DateKey IsA的值和每个组合和 IsB ( 1, 00, 11, 10, 0 不存在,因为这要求 table1 中没有行,因此不会产生结果)。

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

注意:订购只是为了获得 A, B, A+B ... 即我已经做到了 (1,0) = 1, (0,1) = 2, (1,1) = 3。

关于SQL 组用户,如果他们属于一个或多个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50525392/

相关文章:

sql - 在 postgres 的间隔时间内运行触发器

sql - 在不删除 mysql 表的情况下删除更新条件

sql - 两个不同的选择进入同一个临时表

sql-server - 检索同一个表中的两条记录并在一个查询中获取 datediff

sql - 在 SQL Server 插入查询中使用 IF - ELSE

sql - sql中多对多关系的外键

mysql - 如何在巨大的 .sql 文件中提取/拆分 SQL 语句以仅获取某些表?

sql - 选择具有多个 DATETIME 值的最大日期

sql-server - 对象的选择权限被拒绝

sql-server - 表外键/自身关联?