Power Query 中的嵌套 if 语句
Nested if statement in Power Query
我昨天发现并开始使用 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" 中时,它说第一个 #[= 需要一个标记逗号36=]。我已经尝试了各种额外的 "in" 和 "let" 包含,但显然我缺少对 "let"、"in" 如何分配答案的基本理解 "variables" 工作.
你知道我做错了什么吗?
PowerQuery 中的嵌套 if 语句如下所示:
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])
好的,这完全不同,这可能是我在学习如何正确使用 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 语句!
再次感谢您的帮助 - 它确实有助于降低成本。
看起来您可以使用 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 输入使用数据验证。
杰克
我昨天发现并开始使用 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" 中时,它说第一个 #[= 需要一个标记逗号36=]。我已经尝试了各种额外的 "in" 和 "let" 包含,但显然我缺少对 "let"、"in" 如何分配答案的基本理解 "variables" 工作.
你知道我做错了什么吗?
PowerQuery 中的嵌套 if 语句如下所示:
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])
好的,这完全不同,这可能是我在学习如何正确使用 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 语句!
再次感谢您的帮助 - 它确实有助于降低成本。
看起来您可以使用 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 输入使用数据验证。
杰克