【问题标题】:Make a slicer to filter for multiple columns制作切片器以过滤多列
【发布时间】:2019-01-15 06:40:45
【问题描述】:

请帮忙,我有这张表{Table1}

+----+---------+---------+-------+
| ID | Member1 | Member2 | Score |
+----+---------+---------+-------+
|  1 | John    | Jack    |    10 |
|  2 | Jack    | John    |    20 |
|  3 | John    | John    |    30 |
|  4 | Jack    | Jack    |    40 |
|  5 | Sara    | Maya    |    50 |
|  6 | Jack    | Mia     |    60 |
|  7 | Maya    | John    |    70 |
+----+---------+---------+-------+

我是否有可能有一个切片器,例如当我像 {John,Jack} 这样进行多项选择时

它将显示约翰和杰克一起工作的行

预期结果:

+----+---------+---------+-------+
| ID | Member1 | Member2 | Score |
+----+---------+---------+-------+
|  1 | John    | Jack    |    10 |
|  2 | Jack    | John    |    20 |
+----+---------+---------+-------+

到目前为止,我已经尝试创建一个自定义表格并将其放入切片器中,但我无法进行多项选择

Members = 
DISTINCT (
    UNION (
        SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
        SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
    )
)

然后我在表 1 中创建了这个度量,并对其进行过滤以显示值 1

ShowRow = 
IF (
    HASONEVALUE ( 'Members'[T] ),
    IF (
        COUNTROWS ( FILTER ( Table1, Table1[Member1] = VALUES ('Members'[T] ) ) )
            || COUNTROWS ( FILTER ( Table1, Table1[Member2] = VALUES ( 'Members'[T] ) ) ),

        1,
        0
    )
)

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    首先,创建一个包含所有成员的新表(并且不要与其创建任何关系)。

    Members = DISTINCT(UNION(VALUES(Table2[Member1]), VALUES(Table2[Member2])))
    

    (这将默认为列名Member1,但如果您愿意,可以将其重命名为MemberT。)

    现在我们有了这个列表,我们需要做的就是编写一个度量并将其用作过滤器。

    ShowRows := IF(
                    COUNTROWS(
                        INTERSECT(
                            VALUES('Members'[Member]),
                            {MAX(Table2[Member1]), MAX(Table2[Member2])}
                        )
                    ) = 2, 1, 0 )
    

    当您使用Members[Member] 创建切片器时,VALUES 函数将返回您选择的成员列表。当您将其与表中当前行中的Member1Member2 相交时(MAX 用于从行上下文中提取每个值),如果两个成员都在您的切片器选择中,您只会得到2

    现在您需要做的就是将ShowRows 度量添加到视觉级别过滤器并将其设置为is 1

    【讨论】:

      【解决方案2】:

      感谢您的详细描述,您的示例有助于开发解决方案。以下方法应该有效:

      • 按照您的方式创建成员

        Members =     DISTINCT (
           UNION (
               SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
               SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
           )    )
        
      • 在表之间创建两个关系。一个在 TMember1 之间,另一个在 TMember2 之间。其中一个关系将处于非活动状态,这很好。

      • 现在创建两个度量来计算成员是否存在于相应的列中。我们可以选择我们想要在每个中使用的关系来达到预期的结果。

        InMember1 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member2])),1)
        
        InMember2 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member1])),1)
        
      • 现在创建一个最终度量来计算它们是否在任一列中

        InEither = IF([InMember1]+[InMember2]>0,1,0)
        

      这是决赛桌的示例(抱歉,目前还不能嵌入图片)。

      您会注意到原始 Score 列并未针对每一行显示,因为这些关系是如何运作的。我创建了一个 NewScore 度量来解决这个问题

      NewScore = 
      VAR Score1 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member1])),Table1[Score])
      VAR Score2 = SUMX(CALCULATETABLE(Table1,USERELATIONSHIP('Members'[T],Table1[Member2])),Table1[Score])
      RETURN IF(ISBLANK(Score1),Score2,IF(ISBLANK(Score2),Score1,Score1))
      

      我也想链接到这篇文章,因为它可能有助于将来参考:https://www.sqlbi.com/articles/userelationship-in-calculated-columns/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        • 2018-02-22
        • 2019-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        相关资源
        最近更新 更多