【问题标题】:Nested if statement in Power QueryPower Query 中的嵌套 if 语句
【发布时间】:2018-01-30 07:37:44
【问题描述】:

我昨天发现并开始使用 Power Query。我编写了一些查询来填充三个下拉列表,第二个和第三个取决于第一个中选择的内容,第三个则进一步取决于第二个中选择的内容。

当我在这些列表中创建可能项目的列表时,我会在每个列表的顶部添加一个“全部”记录,作为我查询的一部分。我在填充第二个列表时使用了 if 语句第一个列表。

但是,由于第三个列表需要检查是否在第一个和第二个列表框中都选择了“全部”,我相信我需要做两个 if 语句。我昨天整个下午都在互联网上搜索,以找到两个嵌套 if 语句的示例,但成功率有限,每当我自己尝试这样做时,我都会遇到各种语法错误,我缺少一个令牌 Eof 或令牌 then 或逗号是丢失等等。

谁能给我一个简单的例子,说明如何布置嵌套的 if 语句?

谢谢

更新:

感谢您的回答。我仍然有真正的问题。这是我的查询,目前有效。

if Wholesaler_Cmbo_Lnkd_Cell <> "All wholesalers" then

let

    Source = Table.SelectRows(Query_GSR, each [Wholesaler number] = Wholesaler_Cmbo_Lnkd_Cell),
    #"GroupedSource" = Table.Group(Source, {"Month_Name", "Year_No", "Item Category", "Item Category Type", "Tariff status", "Weekday","Transaction type","Group number","Customer account number"}, {{"Gross sales", each List.Sum([Gross sales])},
                                                                                                                                            {"Rebates", each List.Sum([Rebates])},
                                                                                                                                            {"Net sales", each List.Sum([Net sales])},
                                                                                                                                            {"Direct materials", each List.Sum([Direct materials])},
                                                                                                                                            {"Packaging", each List.Sum([Packaging])},
                                                                                                                                            {"Lab consumables", each List.Sum([Lab consumables])},
                                                                                                                                            {"QC costs", each List.Sum([QC costs])},
                                                                                                                                            {"Stock adjustments", each List.Sum([Stock adjustments])},
                                                                                                                                            {"Product margin", each List.Sum([Product margin])},
                                                                                                                                            {"Gross profit", each List.Sum([Gross profit])},
                                                                                                                                            {"Carriage income", each List.Sum([Carriage income])},
                                                                                                                                            {"Carriage expense", each List.Sum([Carriage expense])},
                                                                                                                                            {"Orders", each List.Count([ID])}})
in

    #"GroupedSource" 

else

let

    Source = Query_GSR,
    #"GroupedSource" = Table.Group(Source, {"Month_Name", "Year_No", "Item Category", "Item Category Type", "Tariff status", "Weekday", "Transaction type", "Group number", "Customer account number"}, {{"Gross sales", each List.Sum([Gross sales])},
                                                                                                                                            {"Rebates", each List.Sum([Rebates])},
                                                                                                                                            {"Net sales", each List.Sum([Net sales])},
                                                                                                                                            {"Direct materials", each List.Sum([Direct materials])},
                                                                                                                                            {"Packaging", each List.Sum([Packaging])},
                                                                                                                                            {"Lab consumables", each List.Sum([Lab consumables])},
                                                                                                                                            {"QC costs", each List.Sum([QC costs])},
                                                                                                                                            {"Stock adjustments", each List.Sum([Stock adjustments])},
                                                                                                                                            {"Product margin", each List.Sum([Product margin])},
                                                                                                                                            {"Gross profit", each List.Sum([Gross profit])},
                                                                                                                                            {"Carriage income", each List.Sum([Carriage income])},
                                                                                                                                            {"Carriage expense", each List.Sum([Carriage expense])},
                                                                                                                                            {"Orders", each List.Count([ID])}})
in

    #"GroupedSource"

我知道我的布局很糟糕 - 需要改进。我更希望它看起来像这样:

if Wholesaler_Cmbo_Lnkd_Cell <> "All wholesalers" then

let

    Source = Table.SelectRows(Query_GSR, each [Wholesaler number] = Wholesaler_Cmbo_Lnkd_Cell)

in

    Source

else

let

    Source = Query_GSR

in

    Source

let

    #"GroupedSource" = Table.Group(Source, {"Month_Name", "Year_No", "Item Category", "Item Category Type", "Tariff status", "Weekday", "Transaction type", "Group number", "Customer account number"}, {{"Gross sales", each List.Sum([Gross sales])},
                                                                                                                                            {"Rebates", each List.Sum([Rebates])},
                                                                                                                                            {"Net sales", each List.Sum([Net sales])},
                                                                                                                                            {"Direct materials", each List.Sum([Direct materials])},
                                                                                                                                            {"Packaging", each List.Sum([Packaging])},
                                                                                                                                            {"Lab consumables", each List.Sum([Lab consumables])},
                                                                                                                                            {"QC costs", each List.Sum([QC costs])},
                                                                                                                                            {"Stock adjustments", each List.Sum([Stock adjustments])},
                                                                                                                                            {"Product margin", each List.Sum([Product margin])},
                                                                                                                                            {"Gross profit", each List.Sum([Gross profit])},
                                                                                                                                            {"Carriage income", each List.Sum([Carriage income])},
                                                                                                                                            {"Carriage expense", each List.Sum([Carriage expense])},
                                                                                                                                            {"Orders", each List.Count([ID])}})


in

    #"GroupedSource"

它说应该有一个令牌 Eof,当我试图将整个东西包装在另一个“let”和“in”中时,它说第一个 #"GroupedSource" 上应该有一个令牌逗号。我尝试了各种额外的“in”和“let”包含,但显然我对“let”、“in”以及如何为“变量”分配答案的工作原理缺乏基本的理解。

你知道我做错了什么吗?

【问题讨论】:

    标签: excel-2013 powerquery


    【解决方案1】:

    看起来您可以使用 Table.SelectRows(Power Query 等效于 Excel 中的过滤器)实现相同的目的。您的代码在下面进行了修改。

    let
        Source = Query_GSR,
        
        #"Added Custom" = Table.AddColumn(Source, "Orders", each if [Transaction type] = "Credit" then -1 else 1),
        
        Narrow = if Wholesaler_Cmbo_Lnkd_Cell = "" then #"Added Custom"
            else if Wholesaler_Cmbo_Lnkd_Cell = "All wholesalers" then #"Added Custom"
            else Table.SelectRows(#"Added Custom", each [Wholesaler number] = Wholesaler_Cmbo_Lnkd_Cell)
        
    in
        Narrow

    希望对您有所帮助。您可能希望对 Wholesaler_Cmbo_Lnkd_Cell 输入使用数据验证。

    杰克

    【讨论】:

    • 嗨。谢谢你。是的,还有另一个查询加载到我在下拉单元格中的单列表中以驱动数据验证。如果您不介意,请提出另一个问题 - 在您修改的代码中,以 # 开头并在引号中的内容(例如 #“Added Custom”)和 Narrow 之间有什么区别?
    • *我在下拉菜单中使用
    • 当然。 Power Query 中的每一行新代码都是一个“步骤”。 PQ(Power Query)默认是创建带有空格的步骤名称,例如“Promote Headers”。如果步骤名称中有空格,它将添加主题标签和引号。如果这对您来说很麻烦,您可以右键单击 UI 中的每个步骤并重命名(不带空格)——这将杀死主题标签和引号。这是默认设置,仅此而已。
    • 嗯,好的。非常感谢您的解释。
    【解决方案2】:

    嵌套 if 语句在 PowerQuery 中如下所示:

    if [condition1]
        then (if [condition2] then [true1-true2 result] else [true1-false2 result])
        else [false result]
    

    您还可以在 else 条件中添加 if:

    if [condition1]
        then (if [condition2] then [true1-true2 result]  else [true1-false2 result])
        else (if [condition3] then [false1-true3 result] else [false1-false3 result])
    

    【讨论】:

    • 谢谢。我在原始问题中添加了更多信息,因为我认为这就是我正在做的事情,但我仍然遇到问题。
    【解决方案3】:

    好吧,这完全不同,这可能是我学习如何正确使用 Power Query。我用下面的代码实现了同样的事情:

    let
        Source = Query_GSR,
        #"Added Custom" = Table.AddColumn(Source, "Orders", each if [Transaction type] = "Credit" then -1 else 1),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "WorkOutFilter", each if Wholesaler_Cmbo_Lnkd_Cell = "All wholesalers" then "Keep" else if [Wholesaler number] = Wholesaler_Cmbo_Lnkd_Cell then "Keep" else "Remove"),
        #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([WorkOutFilter] = "Keep")),
        #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"WorkOutFilter"})
    in
        #"Removed Columns"
    

    难以置信。我需要少思考我正在编写代码,而更像这样,我在每条记录上而不是在代码中使用 if 语句!

    再次感谢您的帮助 - 它确实帮助减少了一分钱。

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多