如何使切片器过滤多列

时间:2018-08-08 05:33:10

标签: powerbi dax

请帮助,我有此表{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
    )
)

2 个答案:

答案 0 :(得分:3)

感谢您的详细说明,您的示例对开发解决方案很有帮助。以下方法应该起作用:

  • 像完成操作一样创建成员

    Members =     DISTINCT (
       UNION (
           SELECTCOLUMNS ( Table1, "T", Table1[Member1] ),
           SELECTCOLUMNS ( Table1, "T", Table1[Member2] )
       )    )
    
  • 在表之间创建两个关系。一个在 T Member1 之间,另一个在 T Member2 之间。一种关系是不活跃的,这很好。

Here is what the relationship should look like

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

    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)
    

以下是决赛桌的样张(抱歉,目前无法嵌入图片)。

Click here to view image.

您会注意到,由于关系的工作原理,并不是每行都显示原始的得分列。我创建了一个 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/

答案 1 :(得分:0)

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

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