使用查找来匹配 Power BI/DAX 中列中的多个值

Using lookups to match multiple values in columns in Power BI/DAX

我有一个 table 的大学单位数据。这些单元历来以两种不同的长度(在相同的单元代码下)交付:会话和术语。它看起来像这样:

UnitCode Year OfferedIn
UNIT001 2021 Session1
UNIT001 2021 Session2
UNIT002 2021 Session1
UNIT002 2021 Term4
UNIT003 2020 Session1
UNIT003 2020 Session3
UNIT003 2021 Term2

我需要按两种样式提供的单位对各种图表进行切片,而不管实际的年份、会话或学期。因此,额外的列将如右下方所示:

UnitCode Year OfferedIn OfferedInBoth
UNIT001 2021 Session1
UNIT001 2021 Session2
UNIT002 2021 Session1 TRUE
UNIT002 2021 Term4 TRUE
UNIT003 2020 Session1 TRUE
UNIT003 2020 Session3 TRUE
UNIT003 2021 Term2 TRUE

所以我想查看 UnitCode 列中的值,看看它是否在 OfferedIn 列中具有两种不同类型的值(我可以对类型执行 'contains' 表达式)单位代码是一样的。如何生成 OfferedInBoth 列? (或者我是否需要创建一个新的 table?我希望它尽可能保持动态,因为数据集会随着时间的推移添加新的单位代码。)

您可以使用下面的 DAX 代码创建一个计算列。将“Table1”引用替换为您的 table 名称并添加适用于 SWITCH 语句的任何 session/term 值。

OfferedInBoth = 
VAR unitCode = Table1[UnitCode]
VAR unitCodeTable = FILTER(Table1, Table1[UnitCode] = unitCode)

VAR containsSession = 
    SWITCH(
        TRUE, 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Session1"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Session2"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Session3"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Session4"), TRUE(), 
        FALSE
    )

VAR containsTerm = 
    SWITCH(
        TRUE, 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Term1"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Term2"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Term3"), TRUE(), 
        CONTAINS(unitCodeTable, Table1[OfferedIn], "Term4"), TRUE(), 
        FALSE
    )

RETURN containsSession && containsTerm

您可以创建一个 measure 如下-

true_false = 

var current_row_unitcode = min('your_table_name'[UnitCode])

var count_sess = 
COUNTROWS(
    FILTER(
        ALL('your_table_name'),
        'your_table_name'[UnitCode] = current_row_unitcode
        && LEFT('your_table_name'[OfferedIn],4) = "Sess"
    )
)

var count_term = 
COUNTROWS(
    FILTER(
        ALL('your_table_name'),
        'your_table_name'[UnitCode] = current_row_unitcode
        && LEFT('your_table_name'[OfferedIn],4) = "Term"
    )
)

return if(
    count_sess >=1 && count_term >= 1, "True",""
)

输出-