【问题标题】:How do I keep a column in the filter context and perform a sumx calculation?如何在过滤器上下文中保留一列并执行 sumx 计算?
【发布时间】:2020-04-02 17:45:00
【问题描述】:

我试图通过不同财务预测的动态乘数返回未来 4 年度量值的 sumproduct,但我似乎无法让它发挥作用。想知道是否有人可以提供帮助?

我的数据在一个平面表中:

ForecastName    FiscalYear  TransactionType Value
Forecast1      2019         borrowing       10
Forecast1      2020         borrowing       10
Forecast1      2021         borrowing       10
Forecast1      2022         borrowing       20
Forecast1      2023         borrowing       25
Forecast2      2019         borrowing       30
Forecast2      2019         turnover        40
Forecast3      2019         turnover        50
Forecast3      2020         turnover        50

我有一个衡量借款的方法:

Borrowing = CALCULATE(SUM(Table[Value]),Table[TransactionType]="borrowing")

还有一个乘数的度量(基本上它返回 {1, 1, 0.5, 0}):

Multiplier = 
VAR YearNumber = MAX(Table[Fiscal Year])-2018
RETURN
IF(2.5 > YearNumber,1, IF(2.5 > YearNumber-1,.5,0))

这是我尝试编写 sum product style measure:

Borrowing Forecast = 
VAR CurrentFiscalYear = MAX(Table[Fiscal Year])

RETURN
SUMX((FILTER(ALLEXCEPT(Table,Table[ForecastName]),
           Table[Fiscal Year] < CurrentFiscalYear + 4 &&
           Table[Fiscal Year] >= CurrentFiscalYear)
Mutiplier x Borrowing)

这个想法是,当您将度量放在行上的 FiscalYear 的表上并按 ForecastName 过滤时,它会从行中获取 Fiscal Year 并将其放入变量中,然后使用它来过滤整个表当前和下一个 3 财政年度,但将过滤器保留在 ForecastName 上,然后执行计算并求和。该表显示了我对 Forecast1 的期望结果:

Fiscal Year Borrowing Forecast - DESIRED
2019         25 ((10*1)+(10*1)+(10*0.5)+(20*0))
2020         30 ((10*1)+(10*1)+(20*0.5)+(25*0))

实际结果是一个很大的数字,我不明白,但我认为问题之一是 ALLEXCEPT 部分似乎不起作用..

我还想知道我在 SUMX 的计算部分中尝试使用的度量是否包含 CALCULATE?

非常感谢!

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    这很棘手。如果您愿意在迭代器中定义乘数,这还不错,但我仍在尝试弄清楚如何在正确传递两个行上下文的同时将其抽象出来。

    以下是我可能会如何将其作为一个单一的衡量标准:

    Borrowing Forecast = 
    VAR ThisYear = SELECTEDVALUE ( 'Table'[FiscalYear] ) 
    VAR Years =
        SUMMARIZE (
            ALLSELECTED ( 'Table' ),
            'Table'[FiscalYear],
            "Multiplier", SWITCH (
                TRUE (),
                'Table'[FiscalYear] < ThisYear, 0,
                'Table'[FiscalYear] - ThisYear < 2, 1,
                'Table'[FiscalYear] - ThisYear < 3, 0.5,
                0
            ),
            "Borrowing", CALCULATE (
                SUM ( 'Table'[Value] ),
                'Table'[TransactionType] = "borrowing"
            )
        )
    RETURN
        SUMX ( Years, [Multiplier] * [Borrowing] )
    

    Borrowing 度量很容易单独定义,但乘数比较复杂...


    好的。我想我已经掌握了一些 DAX 黑客魔法。

    要考虑乘数,​​让我们像这样定义它

    MinYear = CALCULATE ( MIN ( 'Table'[FiscalYear] ), ALL ( 'Table' ) )

    Multiplier = 
    VAR YearDiff = SELECTEDVALUE ( 'Table'[FiscalYear] ) - [MinYear]
    RETURN
        SWITCH (
            TRUE (),
            YearDiff < 0, 0,
            YearDiff < 2, 1,
            YearDiff < 3, 0.5,
            0
        )
    

    现在我们可以将预测度量写成如下:

    Forecast = 
    VAR Offset = SELECTEDVALUE ( 'Table'[FiscalYear] ) - [MinYear]
    RETURN
        SUMX (
            ALL ( 'Table'[FiscalYear] ),
            CALCULATE (
                [Multiplier],
                'Table'[FiscalYear] = EARLIER ( 'Table'[FiscalYear] ) - Offset
            ) * [Borrowing]
        )
    

    请注意,我们实际上是将EARLIER ( 'Table'[FiscalYear] ) - Offset 作为变量传递给Multiplier 度量。另请注意,Offset 包含[MinYear],它在通过后与YearDiff 中的那个相抵消,从而有效地

    YearDiff = EARLIER ( 'Table'[FiscalYear] ) - SELECTEDVALUE ( 'Table'[FiscalYear] )

    其中前者是来自行上下文的年份,后者是来自过滤器上下文的年份。

    [MinYear]Offset 之所以存在,是因为您不能传递任意变量,而只能传递表中存在的变量,因此需要进行调整以使其保持在现有的年份范围内。

    这是它在矩阵中的样子:

    【讨论】:

    • 感谢您花时间解决这个问题。现在我考虑一下,没有迫切需要将度量表和乘数表分开(对不起),所以我现在将重点放在您的第一个答案上。据我了解,您正在使用 SUMMARIZE(由于 ALLEXCEPT 仍由 ForecastName 切片器过滤)动态创建一个表,该表有一列包含乘数,一列包含度量。然后,我们使用最终的 SUMX 迭代该表以产生结果。对吗?
    • 哦,感谢您使用 SWITCH 整理我的嵌套 IF - 需要养成这样的习惯!
    • 听起来你明白。第二部分是一个有趣的挑战。 :)
    • 我已经意识到第一个解决方案在仅选择单个预测名称时才正常工作,但是当多个是时,它会聚合它们。我需要保留来自 ForecastName 上表块的过滤器上下文(最终结果是一个包含多行的图表)。我已经用 ALLSELECTED ('Table'[FiscalYear]) 替换了 ALLSELECTED ('Table'),这似乎有效。这对您来说是一个合理的解决方案吗?
    • 是的,这听起来很合理。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2019-12-19
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2021-02-21
    • 2019-05-11
    相关资源
    最近更新 更多