Microsoft Power BI - DAX - 使用变量开发数据集 - NATURALJOIN、GENERATE、GENERATEALL
Microsoft Power BI - DAX - develop a dataset using variables - NATURALJOIN, GENERATE, GENERATEALL
我有一个Power BI Desktop file。我正在用 DAX 语言开发 Calculated Table (CT)。
我在内部使用了一些操作来开发这个 CT(类似于我在 T-SQL 存储过程中所做的)。我这里有 excel file 的来源。
我在此 DAX 查询中开发了许多变量。忽略 table 之间的任何关系,因为它们是变量。
我有以下变量 (a table),名为 VAR_SourceData。请看下面的图片文件:
它有 4 个城市 - NYC、LON、LA、SYD。它有 5 种不同的组合 City-Product.
每个城市可能有一个或多个产品。
City-Product 的组合将只有一个唯一的数量(总是),
不分年份
例如,SYD 和 PineApple 的数量始终为 12,而 SYD 和 Grapes 的数量始终为 11。 (这与年份无关)。
City-Product 的组合可能有也可能没有所有年份的价格。
例如,LON-Orange 只有 2020 年和 2019 年的价格,另一方面
LA-Mango 只有 2019 年和 2015 年的价格。
我有一个师父table(VAR_ReferenceYearLookup) 有所有可能的年份。有9年(2022-2014),按降序排列。
我需要 table VAR_Desired_Output:
的期望输出
我对VAR_Desired_Outputtable的解释如下:
table 将具有 City-Product 的所有可能组合,并具有固定数量。城市、产品、数量与年份无关。但是,价格取决于年份。如果 VAR_SourceData table 中没有 Price in a year 的数据,VAR_Desired_Output table 必须显示空白。
我想要的输出必须包含 City-Product 的所有可能组合的所有年份(2022-2014(最好按降序排列)),以及固定数量;数量取决于 City-Product 组合,但不取决于年份。如果一年的价格在 VAR_SourceData table 中不可用,VAR_Desired_Output table 必须显示空白。
因此每个 City-Product 组合必须恰好有 9 年,且数量总是固定的。
我有 5 种不同的 City-Product 组合,因此 VAR_Desired_Output table 有 45 行。
我尝试使用 NATURALINNERJOIN、NATURALLEFTOUTERJOIN、GENERATE 等。但我无法解决这个问题。我需要它作为 DAX 解决方案,而不是在 Power Query 中(我的 table 有许多计算列)。
谁能帮我实现我的目标?
您可以在 table VAR_SourceData 中添加一些高级查询步骤以获得所需的输出。尝试在 table-
的 Advance Query Editor window 中添加以下步骤
注意:在下面的第一步
中相应地更改上一步名称
let
//your previous existing steps,
#"Added Custom" = Table.AddColumn(#"previous step name", "Custom", each List.Sort(
List.Numbers(
List.Min(VAR_ReferenceYearLookup[Year_LKP]),
List.Max(VAR_ReferenceYearLookup[Year_LKP])
- List.Min(VAR_ReferenceYearLookup[Year_LKP]) + 1
),
Order.Descending
)),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Price_new", each if [Year]=[Custom] then [Price] else null),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Quantity_new", each if [Year] = [Custom] then [Quantity] else null),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom2",{"Year", "Price", "Quantity"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Custom", "Year"}, {"Price_new", "Price"}, {"Quantity_new", "Quantity"}}),
#"Grouped Rows" = Table.Group(#"Renamed Columns", {"City", "Product", "Year"}, {{"Price", each List.Max([Price]), type nullable number}, {"Quantity", each List.Max([Quantity]), type nullable number}})
in
#"Grouped Rows"
输出-
如前所述,我需要一个基于 DAX 的解决方案,而不是在 Power Query 中。
我假设这 2 个变量 (VAR_SourceData, VAR_ReferenceYearLookup) 是表格,下面有这段代码:
DesiredOutput_CT =
VAR src = DISTINCT(
SELECTCOLUMNS(
VAR_SourceData,
"City", [City],
"Product", [Product],
"Quantity", [Quantity]
)
)
VAR cj = CROSSJOIN(src, VAR_ReferenceYearLookup)
VAR t1 = SELECTCOLUMNS(
cj,
"Concat", [City] & "-" & [Product] & "-" & [Year_LKP],
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Year", [Year_LKP]
)
VAR t2 = SELECTCOLUMNS(
VAR_SourceData,
"Concat", [City] & "-" & [Product] & "-" & [Year],
"Price", [Price]
)
VAR t3 = SELECTCOLUMNS(
t1,
"Concat", [Concat] & "Z",
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Year", [Year]
)
VAR t4 = SELECTCOLUMNS(
t2,
"Concat", [Concat] & "Z",
"Price", [Price]
)
VAR t5 = NATURALLEFTOUTERJOIN(t3,t4)
VAR t6 = SELECTCOLUMNS(
t5,
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Price", [Price],
"Year", [Year]
)
RETURN t6
我有一个Power BI Desktop file。我正在用 DAX 语言开发 Calculated Table (CT)。
我在内部使用了一些操作来开发这个 CT(类似于我在 T-SQL 存储过程中所做的)。我这里有 excel file 的来源。
我在此 DAX 查询中开发了许多变量。忽略 table 之间的任何关系,因为它们是变量。
我有以下变量 (a table),名为 VAR_SourceData。请看下面的图片文件:
它有 4 个城市 - NYC、LON、LA、SYD。它有 5 种不同的组合 City-Product.
每个城市可能有一个或多个产品。
City-Product 的组合将只有一个唯一的数量(总是), 不分年份
例如,SYD 和 PineApple 的数量始终为 12,而 SYD 和 Grapes 的数量始终为 11。 (这与年份无关)。
City-Product 的组合可能有也可能没有所有年份的价格。 例如,LON-Orange 只有 2020 年和 2019 年的价格,另一方面 LA-Mango 只有 2019 年和 2015 年的价格。
我有一个师父table(VAR_ReferenceYearLookup) 有所有可能的年份。有9年(2022-2014),按降序排列。
我需要 table VAR_Desired_Output:
的期望输出我对VAR_Desired_Outputtable的解释如下:
table 将具有 City-Product 的所有可能组合,并具有固定数量。城市、产品、数量与年份无关。但是,价格取决于年份。如果 VAR_SourceData table 中没有 Price in a year 的数据,VAR_Desired_Output table 必须显示空白。
我想要的输出必须包含 City-Product 的所有可能组合的所有年份(2022-2014(最好按降序排列)),以及固定数量;数量取决于 City-Product 组合,但不取决于年份。如果一年的价格在 VAR_SourceData table 中不可用,VAR_Desired_Output table 必须显示空白。
因此每个 City-Product 组合必须恰好有 9 年,且数量总是固定的。
我有 5 种不同的 City-Product 组合,因此 VAR_Desired_Output table 有 45 行。
我尝试使用 NATURALINNERJOIN、NATURALLEFTOUTERJOIN、GENERATE 等。但我无法解决这个问题。我需要它作为 DAX 解决方案,而不是在 Power Query 中(我的 table 有许多计算列)。
谁能帮我实现我的目标?
您可以在 table VAR_SourceData 中添加一些高级查询步骤以获得所需的输出。尝试在 table-
的 Advance Query Editor window 中添加以下步骤注意:在下面的第一步
中相应地更改上一步名称let
//your previous existing steps,
#"Added Custom" = Table.AddColumn(#"previous step name", "Custom", each List.Sort(
List.Numbers(
List.Min(VAR_ReferenceYearLookup[Year_LKP]),
List.Max(VAR_ReferenceYearLookup[Year_LKP])
- List.Min(VAR_ReferenceYearLookup[Year_LKP]) + 1
),
Order.Descending
)),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"),
#"Added Custom1" = Table.AddColumn(#"Expanded Custom", "Price_new", each if [Year]=[Custom] then [Price] else null),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Quantity_new", each if [Year] = [Custom] then [Quantity] else null),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom2",{"Year", "Price", "Quantity"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Custom", "Year"}, {"Price_new", "Price"}, {"Quantity_new", "Quantity"}}),
#"Grouped Rows" = Table.Group(#"Renamed Columns", {"City", "Product", "Year"}, {{"Price", each List.Max([Price]), type nullable number}, {"Quantity", each List.Max([Quantity]), type nullable number}})
in
#"Grouped Rows"
输出-
如前所述,我需要一个基于 DAX 的解决方案,而不是在 Power Query 中。
我假设这 2 个变量 (VAR_SourceData, VAR_ReferenceYearLookup) 是表格,下面有这段代码:
DesiredOutput_CT =
VAR src = DISTINCT(
SELECTCOLUMNS(
VAR_SourceData,
"City", [City],
"Product", [Product],
"Quantity", [Quantity]
)
)
VAR cj = CROSSJOIN(src, VAR_ReferenceYearLookup)
VAR t1 = SELECTCOLUMNS(
cj,
"Concat", [City] & "-" & [Product] & "-" & [Year_LKP],
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Year", [Year_LKP]
)
VAR t2 = SELECTCOLUMNS(
VAR_SourceData,
"Concat", [City] & "-" & [Product] & "-" & [Year],
"Price", [Price]
)
VAR t3 = SELECTCOLUMNS(
t1,
"Concat", [Concat] & "Z",
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Year", [Year]
)
VAR t4 = SELECTCOLUMNS(
t2,
"Concat", [Concat] & "Z",
"Price", [Price]
)
VAR t5 = NATURALLEFTOUTERJOIN(t3,t4)
VAR t6 = SELECTCOLUMNS(
t5,
"City", [City],
"Product", [Product],
"Quantity", [Quantity],
"Price", [Price],
"Year", [Year]
)
RETURN t6