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