【问题标题】:DAX users with multiple emails拥有多封电子邮件的 DAX 用户
【发布时间】:2019-09-12 14:15:37
【问题描述】:

我有一个“交易表”,其中包含用户唯一的用户名、电子邮件地址和其他列。我想创建一个衡量标准,显示具有独特多封电子邮件的独特用户。应该相当于这条sql语句:

select user, count(distinct email)
from usertable
group by user
having count(distinct email) >1

【问题讨论】:

    标签: sql dax measure equivalent


    【解决方案1】:

    此 DAX 将返回一个表,相当于您的 SQL 语句:

    UsersWithMultipleEmail = 
        FILTER ( 
            SUMMARIZECOLUMNS ( 
                usertable[user],
                "# emails", COUNTROWS ( usertable )
            ),
            [# emails] > 1
        )
    

    此度量将返回不同电子邮件的数量,然后您可以将其用于可视化:

    MultipleEmails = 
        IF (
            DISTINCTCOUNT ( usertable[email] ) > 1,
            DISTINCTCOUNT ( usertable[email] ),
            BLANK()
        )
    

    【讨论】:

      【解决方案2】:

      请注意,度量返回标量,而不是表格结果集。所以我在这里从三个方面来回答。第一个是最少的 DAX,并且依赖于客户端报告工具中的过滤。第二个是在内部进行过滤的措施,因此将始终返回大于 1 封电子邮件的用户数。最后一个是DAX查询,相当于SQL查询。

      不过,首先,我将在 Power BI 中创建一个快速而肮脏的数据集以供使用:

      //Users
      let
          Source =
              #table(
                  {"User", "Email"},
                  {{"Bob", "bob1@example.com"},
                   {"Bob", "bob2@example.com"},
                   {"Joe", "joe@example.com"},
                   {"Joe", "joe@example.com"},
                   {"Jane", "jane@example.com"}})
      in
          Source
      

      这为我们提供了一个如下所示的表格:

      User    Email
      Bob     bob1@example.com
      Bob     bob2@example.com
      Joe     joe@example.com
      Joe     joe@example.com
      Jane    jane@example.com
      

      所以,对于我们的简单版本:

      Distinct Emails = DISTINCTCOUNT ( 'Users'[Email] )
      

      我们可以使用 [DistinctEmails] > 1 上的过滤器构建“用户”[User] 和 [DistinctEmails] 的视觉效果:

      因此,现在始终返回具有不同电子邮件计数 > 1 的用户计数的度量。即使在不使用“用户”[用户]字段的视觉效果中,或者在子和总计级别上,这也将起作用。请注意,这是用户数,而不是电子邮件数。

      User Count with Multiple Distinct Emails = 
      COUNTROWS (
          FILTER (
              VALUES ( 'Users'[User] ),
              [Distinct Emails] > 1
          )
      )
      

      请注意,我们在此度量的定义中使用了我们的 [Distinct Emails]。 FILTER 迭代在 arg1 中传递的表。这是VALUES ( 'Users'[User] ),它返回列中唯一值的 1 列表。对于该表中的每一行,它评估 arg2 中的谓词 [Distinct Emails] > 1。因此,它会删除任何未通过该测试的用户。 FILTER 输出所有通过测试的值的表格。 COUNTROWS ...好吧,它计算行数。问:

      这是视觉上的衡量标准。请注意,视觉对象上没有过滤器。

      最后是对原始 SQL 的等效查询。

      EVALUATE
      FILTER (
        SUMMARIZECOLUMNS (
          'Users'[User],
          "Email Count", [Distinct Emails]
        ),
        [Email Count] > 1
      )
      

      SUMMARIZECOLUMNS 选择、分组、过滤器和项目。在这里,我们使用它来选择和分组“用户”[用户]。我们正在投影一个新列,别名为“电子邮件计数”,计算结果为 [Distinct Emails](我们在上面定义的度量)。我们将SUMMARIZECOLUMNS 的输出('Users'[User] 和 [Email Count] 的两列表)传递给FILTER,它检查投影列 [Email Count] 的值。

      结果集只是 bob。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 2013-12-15
        • 2019-07-05
        相关资源
        最近更新 更多