DAX LOOKUPVALUE 到 return "Undefined" 而不是空白?

DAX LOOKUPVALUE to return "Undefined" instead of blank?

如果 LOOKUPVALUE 函数未找到匹配项,如何获取替代结果字符串消息 "Not found" 或 "Undefined"? LOOKUPVALUE 函数的文档提到使用第四个参数很容易实现。第四个参数是可选的。但是当我输入它时,我收到一条错误消息。

这就是我需要它的原因。我想要一个尚未在字典中定义的产品类别。这可能是一个经典的场景。字典 table 是手动更新的,有一些滞后,因此它不包含 FactTable 中弹出的所有独特产品。我想通过 Bridge table 解决它,它将自动手动输入词典。

我使用下面的 Bridge table.

Bridge = 
    ADDCOLUMNS(
        DISTINCT(UNION(DISTINCT(FactTable[product]), DISTINCT(Dictionary[product])))
        , "FoundCategory"
        , LOOKUPVALUE(
              Dictionary[category]
            , Dictionary[product]
            , FactTable[product]
            --, "Undefined" -- Uncommenting this argument throws error
    )
)

编辑。 Power BI 2019 更新后,此问题消失。它一定是某种错误。上面的代码正在运行。万岁!

如何强制 LOOKUPVALUE 函数为 return Undefined 字符串值而不是 blank()

我能想到的是:

Bridge = 
ADDCOLUMNS(
    DISTINCT(UNION(DISTINCT(FactTable[product]), DISTINCT(Dictionary[product])))
    , "FoundCategory"
    , IF(ISBLANK(
        LOOKUPVALUE(
          Dictionary[category]
        , Dictionary[product]
        , FactTable[product])
        )
        ,"Unmapped"
        ,LOOKUPVALUE(
          Dictionary[category]
        , Dictionary[product]
        , FactTable[product])
        )
)

但是我想知道它是否不计算两次LOOKUPVALUE。如果是这样,什么方法可能更有效?

如果您想重现该问题,请点击此处 table。

事实表:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSiwoyElVitWJVkpKzANCMLMgvySxJF8pNhYA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [product = _t])
in
    Source

字典:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSiwoyElV0lFKKyrNLFGK1YlWKsgvSSzJBwqVpaanliQmAaVjYwE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [product = _t, category = _t])
in
    Source

你可以在其中使用 if else 循环,像这样:-

Bridge = 
    ADDCOLUMNS
   (
    DISTINCT(UNION(DISTINCT(FactTable[product]), DISTINCT(Dictionary[product]))),
    "FoundCategory",
    IF(
          LOOKUPVALUE(
          Dictionary[category],
          Dictionary[product],
          FactTable[product]) = "", 
          "Undefined", 
          LOOKUPVALUE(
          Dictionary[category],
          Dictionary[product],
          FactTable[product]))
    )

或者你可以这样做,

Bridge = 
        DISTINCT(UNION(DISTINCT(FactTable[product]), DISTINCT(Dictionary[product])))

然后计算列:-

foundCategory = 

var look_up_value = LOOKUPVALUE(
          Dictionary[category],
          Dictionary[product],
          Bridge[product])

var out = IF(look_up_value = BLANK(), "undefined", look_up_value)

return out

另一种方法是使用 LOOKUPVALUE 函数替代值字段。这允许您指定一个返回值而不是空白,从而节省了检查它是否为空白的时间。

LOOKUPVALUE 在 Microsoft 关于该函数的在线文档中。

编辑: 在 Power BI Desktop 中进行了快速测试,并能够获取替代值以在现有模型的计算列中工作。

LOOKUPVALUE(
          Dictionary[category]
        , Dictionary[product]
        , FactTable[product])
        , "Undefined"
)