带有过滤值的非过滤值列表

时间:2021-04-07 13:22:30

标签: powerbi dax

我正在尝试在 Power BI 中组合一个参考工具,用户可以在其中过滤包含各种客户端的属性访问信息的数据:

<头>
Client_ID Property_ID Date_Start Date_End
client_1 1 1/1/2019 1/7/2019
client_2 1 1/5/2019 1/12/2019
client_3 1 1/2/2019 1/14/2019
client_1 2 2/1/2019 2/5/2019
client_3 2 2/2/2019 2/8/2019
client_4 2 2/4/2019 2/12/2019
client_2 3 2019/3/3 3/10/2019
client_3 3 3/9/2019 2019/3/13
client_4 3 3/12/2019 2019/3/25
client_1 4 4/5/2019 4/10/2019
client_2 4 4/6/2019 4/9/2019
client_3 4 4/12/2019 4/15/2019
  1. 用户可以从切片器中选择一个客户并生成他们所有住宿的列表(例如,client_1 的住宿访问):
<头>
切片器: client_1
Client_ID 属性_ID Date_Start Date_End
client_1 1 1/1/2019 1/7/2019
2 2/1/2019 2/5/2019
4 4/5/2019 4/10/2019
  1. 这是有问题的部分:用户应该能够生成所有其他客户的列表,这些客户都住在 client_1 所在的相同属性中:
<头>
切片器: client_1
属性_ID Client_ID Date_Start Date_End
1 client_1 1/1/2019 1/7/2019
1 client_2 1/5/2019 1/12/2019
1 client_3 1/2/2019 1/14/2019
2 client_1 2/1/2019 2/5/2019
2 client_3 2/2/2019 2/8/2019
2 client_4 2/8/2019 2/12/2019
4 client_1 4/5/2019 4/10/2019
4 client_2 4/6/2019 4/9/2019
4 client_3 4/12/2019 4/15/2019

我能够通过切片器中选定的“client_1”过滤器生成 client_1 所在的所有相关属性的列表,但是该过滤也会向下传递到所有其他 Client_ID。所以最后我得到了与上面第 1 步相同的表,所有其他客户端都被过滤掉了。有没有办法从“Client_ID”字段中删除过滤器上下文,以便只过滤 Property_ID 以仅显示“client_1”保留的那些?

真实数据包含重复的“Client_ID”值,因为某些客户在此期间可能不止一次停留在同一属性上,因此在尝试引用 DAX 中所有未过滤的值时提出了额外的挑战。

最终目标是列出在同一时间段内与 client_1 入住相同属性的所有客户:

<头>
切片器: client_1
Client_ID 属性_ID Date_Start Date_End Client_ID Date_Start Date_End
client_1 1 1/1/2019 1/7/2019 client_2 1/5/2019 1/12/2019
client_3 1/2/2019 1/14/2019
2 2/1/2019 2/5/2019 client_3 2/2/2019 2/8/2019
client_4 2/8/2019 2/12/2019
4 4/5/2019 4/10/2019 client_2 4/6/2019 4/9/2019

谢谢!

1 个答案:

答案 0 :(得分:0)

我想这取决于客户表和访问表之间的活动关系的必要性。这些是假设的表格。

enter image description here

我将从非活动关系开始:

enter image description here

切片器不再作用于访问 [Client_ID] 列,但可视化继续收集有关切片器的信息,而不是将切片器和表格之间的交互(我使用表格即,抱歉)设置为无通过格式 /编辑互动。

它没有在不同的场景中进行全面测试,因为表很小,我给了更多的时间给其他选项,但我认为花更多的时间在这个选项上是正确的方法。

Test2 = 
VAR SelectedClient=VALUES(Clients[Client_ID])
VAR CurrentProperty= CALCULATETABLE(VALUES(Visits[Property_ID]))
VAR FilteredProperties= 
CALCULATETABLE(VALUES(Visits[Property_ID]),ALL(Visits),SelectedClient,USERELATIONSHIP(Clients[Client_ID],Visits[Client_ID]))
VAR PropertiesBySC = COUNTROWS(INTERSECT(FilteredProperties,CurrentProperty))
RETURN 
PropertiesBySC

enter image description here

在以下两个示例中,Clients Table 和 Visits Table 之间的关系保持活动状态。

enter image description here

由于度量存在于表中,因此无需为与度量相关的“此视觉对象上的过滤器”设置参数:

Test = 
VAR SelectedClient= VALUES(Clients[ClientName])
VAR CurrentProperty= CALCULATETABLE(VALUES(Visits[Property_ID]),ALL(Clients))
VAR FilteredProperties= CALCULATETABLE(VALUES(Visits[Property_ID]),ALL(Visits),SelectedClient)
VAR PropertiesBySC = COUNTROWS(INTERSECT(FilteredProperties,CurrentProperty))
RETURN 
IF(
    ISFILTERED(Clients[Client_ID]) && PropertiesBySC=1 &&HASONEVALUE(Clients[Client_ID]),
    "Property related to " & SelectedClient & "'s visits",
    IF(
        ISFILTERED(Clients[Client_ID]) && PropertiesBySC<>1,
        BLANK(),
        "Multiple clients Selected"
        )
)

enter image description here

同样,它没有在不同场景中进行全面测试,因为表很小,我给了最后一个也没有完全测试的选项更多的时间。

最终目标,保留所选客户 (client_1) 访问的每个属性 (1,2,4) 的日期范围,并将此范围与访问表中每一行的日期范围相交。

Test3 = 
VAR SelectedClient= CALCULATETABLE(VALUES(Clients[Client_ID]))
VAR CurrentProperty= CALCULATETABLE(VALUES(Visits[Property_ID]),ALL(Clients))
VAR CurrentDateStart=CALCULATETABLE(VALUES(Visits[Date_Start]),ALL(Clients))
VAR CurrentDateEnd=CALCULATETABLE(VALUES(Visits[Date_End]),ALL(Clients))
VAR CurrentDateRange=CALCULATETABLE(DATESBETWEEN(Dates[Date],CurrentDateStart,CurrentDateEnd),ALL(Clients))
VAR PropertiesVisitedBySC= CALCULATETABLE(VALUES(Visits[Property_ID]),ALL(Visits),Visits[Client_ID] IN SelectedClient)
VAR HasTheSCVisitedTheCurrentProperty = //1=Yes|Blank()=No
COUNTROWS(INTERSECT(PropertiesVisitedBySC,CurrentProperty))
////
VAR SCVisitsForCurrentProperty =
SELECTCOLUMNS(
    CALCULATETABLE(Visits,ALLEXCEPT(Visits,Visits[Property_ID]),Visits[Client_ID] IN SelectedClient),
    "Date_Start",Visits[Date_Start],"Date_End",Visits[Date_End])
VAR DateRangesForSCVisits= 
SELECTCOLUMNS(
    GENERATE(SCVisitsForCurrentProperty,DATESBETWEEN(Dates[Date],[Date_Start],[Date_End])),
    "Date",[Date])
VAR HasTheSCVisitedTheCurrentPropertyInAnyDateRange=
COUNTROWS(INTERSECT(CurrentDateRange,DateRangesForSCVisits))
RETURN 
//>0=Yes|Blank()=No
IF( 
    HasTheSCVisitedTheCurrentProperty=1
    &&
    HasTheSCVisitedTheCurrentPropertyInAnyDateRange>0,
    "Property and Dates related to " & SelectedClient & "'s visits"
    )

enter image description here

为了避免因未优化度量而导致多选问题,我为切片器激活了单选选项。

enter image description here

最后,我认为使用允许我们基于切片器评估 DAX 查询的表会更容易。干杯!

编辑

非活跃关系,同一客户在不同日期范围内访问同一物业。

enter image description here

测量

Test2 := 
VAR SelectedClient = CALCULATETABLE(VALUES(Clients[Client_ID]))
VAR CurrentProperty = CALCULATETABLE(VALUES(Visits[Property_ID]))
VAR CurrentStartDate = CALCULATE(VALUES(Visits[Date_Start]))
VAR CurrentEndDate = CALCULATE(VALUES(Visits[Date_End]))
VAR CurrentDateRange = DATESBETWEEN(Dates[Date],CurrentStartDate,CurrentEndDate)
VAR PropertiesVisitedBySC = 
CALCULATETABLE(
    VALUES(Visits[Property_ID]),
    ALL(Visits),
    Visits[Client_ID] IN SelectedClient,
    USERELATIONSHIP(Clients[Client_ID],Visits[Client_ID]))
VAR HasTheSCVisitedTheCurrentProperty = //1=Yes|Blank()=No
COUNTROWS(INTERSECT(PropertiesVisitedBySC,CurrentProperty))
VAR SCVisitsForCurrentProperty =
SELECTCOLUMNS(
    CALCULATETABLE(Visits,ALLEXCEPT(Visits,Visits[Property_ID]),Visits[Client_ID] IN SelectedClient),
    "Date_Start",Visits[Date_Start],"Date_End",Visits[Date_End])
VAR DateRangesForSCVisits= 
SELECTCOLUMNS(
    GENERATE(SCVisitsForCurrentProperty,DATESBETWEEN(Dates[Date],[Date_Start],[Date_End])),
    "Date",[Date])
VAR HasTheSCVisitedTheCurrentPropertyInAnyDateRange=
COUNTROWS(INTERSECT(CurrentDateRange,DateRangesForSCVisits))
RETURN 
//>0=Yes|Blank()=No
IF( 
    HasTheSCVisitedTheCurrentProperty=1,
    HasTheSCVisitedTheCurrentPropertyInAnyDateRange)