快速提示: Conditionally 替换值 Based on Other Values in 功率查询

功率查询(M)使许多数据转换活动变得更加容易,而价值替换就是其中之一。您可以轻松地右键单击Excel或Power BI中的Power Query中的任何所需值,或者通常是Power Platform的其他组件,然后只需用任何所需的替代项替换该值即可。首先,根据某些条件替换值似乎并不那么容易。一世’我们已经看到许多Power Query(M)开发人员添加了新列来完成该任务。但是,添加新列并不总是一个好主意,尤其是当您可以在Power Query中仅一步之遥就可以做到这一点时。在本文中,我向您展示了一种快速简便的方法,可以帮助您处理许多不同的价值替换方案。

假设您有一个如下表,并且如果[A] = [B],则需要用[C]列的值替换[B]列的值。

 Power BI 中的样本数据

一种方法是使用以下逻辑添加新的条件列:

if [B] = [A] then [C] else [B]

好吧,它工作得很好,但是等等,你’重新添加一个新列吧?不会’最好在不添加新列的情况下处理上述简单情况?如果您的回答是,请继续阅读。

您可以使用查询编辑器用户界面在Power Query中构造值替换,以避免拼写错误,区分大小写等问题。…老实说,在可能的情况下使用UI比键入长M代码要容易得多。无论如何… Let’■删除我们之前创建的新列,然后进行第二种情况。

右键单击B列中的值,然后单击“Replace Values”

功率查询 替换值

将所选值替换为任何所需值。在我的示例中,我用1000代替了5。

替换值 in 功率查询

您现在需要做的就是用正确的逻辑修改代码。让’s查看逻辑,我们要检查 表的每个原始数据中列[B]的值,并仅在[B] = [A]时才用列[C]的值替换。

我强调了“”因为它是Power Query中的重要关键字。

因此,我们只需要修改Power Query代码,如下所示:

  • 更换“5” 与 每个[A]
  • 更换“1000” with 每个[C]

所以最终的代码将是:

=Table.ReplaceValue(Source,  每个[A] ,  每个[C] ,Replacer.ReplaceText,{"B"})
有条件地替换Power Query中的值

上面的代码在[B]中查找列[A]的值,如果它们’re equal然后将列[B]的值替换为列[C]的值。

要了解有关如何在Power Query中进行引用的更多信息,请查看我以前的文章 这里 .

11 thoughts on “快速提示: Conditionally 替换值 Based on Other Values in 功率查询

  1. 我相信您应该将Replacer.ReplaceText替换为Replacer.ReplaceValue。否则,记录[A =”1″,B=”11″,C=”5″]将更改为[A =”1″,B=”55″,C=”5″].

    这会弄乱列的数据类型,因此您应该使用以下方法重新为其分配名称:
    = Value.ReplaceType(#”替代价值步骤”,Value.Type(#”重置价值之前的步骤”))

    1. 嗨,Omri,
      感谢您的反馈意见。没错,Replacer.ReplaceValue更安全。
      我的目的是解释如何轻松地有条件地替换值。我努力保持“Quick Tips”系列文章越短越好,内容越丰富。
      但是您提出了非常明智的观点。
      再次感谢您的贡献。
      干杯

      1. 嗨Soheil,
        我想知道您是否可以帮助我找到为什么此M查询不起作用的原因:

        Table.ReplaceValue(#”Changed Type”,””,(每个[ACCT_CODE] = List.Contains(#”EMP”[EMP_NUM], [ACCT_CODE])),Replacer.ReplaceValue,{“ACCT_CODE”})

        I am trying to 更换 null value with the account code that I can find from 电磁脉冲 query. With 电磁脉冲_NUM as the key to link to 电磁脉冲.

        1. 嗨辛西娅,

          欢迎来到BIInsight.com。
          看,您的代码不正确,您不能说“每个SOMETHING = List.Contains(***)”。
          请注意,List.Contains()的输出为布尔值(真/假).
          也许您会发现以下代码有帮助。当#“ Distinct ProdcutKeys” [ProductKey] =#时,我试图将“ Products”表(当前表)中“ ProductSubcategoryKey”列中的空值替换为另一个表“ Distinct ProdcutKeys”中“ ProductKey”列中的值。 “产品” [ProductKey]:

          Table.ReplaceValue(#“已更改类型”,null,如果为List.Contains(#” Distinct ProdcutKeys” [ProductKey],[ProductKey]),则分别为[0],否则为0,Replacer.ReplaceValue,{“ ProductSubcategoryKey”})

          我们在这里查询的是:

          • 查看当前查询中的[ProductSubcategoryKey]列
          • 将空值替换为以下结果:
            • 对于#“ Distinct ProdcutKeys”表中的[ProductKey]列,对于每个值,当#“ Distinct ProdcutKeys” [ProductKey]与当前表中的[ProductKey]匹配时(#“ Products”)返回“ True”
            • 如果结果为“ True”,则返回相应的[ProductKey]
            • 否则返回0

          希望能有所帮助,

          干杯


          1. Soheil,非常感谢。因为我是M查询的初学者,所以请多多包涵。

            我进行了如下更改并得到了“blanks”:
            Table.ReplaceValue(#”Changed Type”,null,如果List.Contains(#”EMP”[EMP_NUM],[EMP_NUM]),然后再[ACCT_CODE]“0000xxxx”,Replacer.ReplaceValue,{“ACCT_CODE”})

            The 电磁脉冲 query and the current query has the relationship with the key [EMP_NUM].

            I can find the 电磁脉冲_NUM in the 电磁脉冲 query. ACCT_CODE does exist non-blanks.

            您能否让我知道我又做错了什么?谢谢

          2. 嗨辛西娅,

            您的数据源是什么?是SQL Server,MySQL还是任何其他受支持的DBMS?您所指的关系在哪里?您是指源数据库还是Power BI中的关系?
            我问的是,在Power BI中,当您的问题与Power Query有关时,您在模型中建立关系。
            您不会在Power Query中创建/使用关系。
            为了更加清楚,Power BI包括Power Query层(这是您的数据准备层)和一个保留所有关系,度量,计算所得列和计算表的模型。
            在数据准备层中,您使用Power Query(M)表达式语言,而在模型中,您使用DAX表达式语言。

            在创建关系之前,您的问题是关于Power Query的。

            请详细说明,
            干杯

  2. 我的数据源来自Excel工作表。你是对的。我正在尝试加载数据并同时清理数据。这些关系在Power BI中设置。因此,它赢了’t work. Thanks

  3. 谢谢你的解释。我想知道您是否可以在这里帮助我解决问题。一世’m试图根据另一列修改几个列’的值,但我在使用代码时遇到了麻烦。如果列A中的值也为0,我想将列B和列C的值更改为0。您知道如何编写条件替换的代码吗?

有什么想法吗?在这里与我们分享:

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.