我正在尝试在 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 |
切片器: | 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 |
切片器: | 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 |
谢谢!
答案 0 :(得分:0)
我想这取决于客户表和访问表之间的活动关系的必要性。这些是假设的表格。
我将从非活动关系开始:
切片器不再作用于访问 [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
在以下两个示例中,Clients Table 和 Visits Table 之间的关系保持活动状态。
由于度量存在于表中,因此无需为与度量相关的“此视觉对象上的过滤器”设置参数:
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"
)
)
同样,它没有在不同场景中进行全面测试,因为表很小,我给了最后一个也没有完全测试的选项更多的时间。
最终目标,保留所选客户 (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"
)
为了避免因未优化度量而导致多选问题,我为切片器激活了单选选项。
最后,我认为使用允许我们基于切片器评估 DAX 查询的表会更容易。干杯!
编辑
非活跃关系,同一客户在不同日期范围内访问同一物业。
测量
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)