【问题标题】:Calculating payback period using DAX使用 DAX 计算投资回收期
【发布时间】:2018-04-05 16:40:06
【问题描述】:

我正在对资本预算进行一些计算,我的数据模型中有以下两个表

我正在尝试在 DAX 中构建一个计算列,以确定项目表中每个项目的投资回收期。我在这里汇总了计算,只是不确定如何在 DAX 中执行此计算。

计算投资回收期的逻辑步骤:

  1. 对于每个项目,找到相关指标的每个日期的累计和(包括运营支出节省和运营支出实施成本,但不包括收入或营运资金)

  2. 查找累积总和大于零的 MIN 日期(“收支平衡”日期“

  3. 查找实施成本非零的 MIN 日期(“投资日期”

  4. 找出 #2 和 #3 之间的差异(以月为单位)以确定投资回收期

编辑:

所列项目的答案是 7 个月。我已经在 Excel 中构建了一个中间表来开发答案,但我希望能够使用 DAX 在 PowerPivot 表中直接执行此操作。

【问题讨论】:

  • 您能否根据您的样本给出您的 4 位数的预期结果?它看起来像这样 (2) = 1/1/2018(因为 OpEx 实施 > 0)和 (3) = 1/1/2018(因为 OpEx 实施 0)。我猜这不对?
  • 我已经包含了上面的预期结果。请注意,此计算不包括收入和营运资金指标。

标签: dax powerpivot


【解决方案1】:

我已经制作了这个作为解决方案:

  1. 创造价值,确保成本为 - 节省为 + (ValCorr)
  2. 创建运行总和 (RunningSum)
  3. 查找投资日期(InvestmentDate)
  4. 查找盈亏平衡日期 (BreakEvenDate)
  5. 找不同(回报)

DAX:

RunningSum = 
CALCULATE(SUM(Impacts[ValCorr]);
    FILTER(
        ALL(Impacts);
        Impacts[ProjectID] = EARLIER(Impacts[ProjectID]) &&
        Impacts[Date] <= EARLIER(Impacts[Date])
    ))


InvestmentDate =
CALCULATE (
    FIRSTNONBLANK ( Impacts[Date]; 0 );
    FILTER ( ALL ( Impacts ); Impacts[RunningSum] <> 0 )
)

BreakEvenDate =
CALCULATE (
    FIRSTNONBLANK ( Impacts[Date]; 0 );
    FILTER ( ALL ( Impacts ); Impacts[RunningSum] > 0 )
)

Payback = DATEDIFF(Impacts[InvestmentDate];Impacts[BreakEvenDate];MONTH)

结果:

祝你好运!

【讨论】:

    【解决方案2】:

    经过大量的反复试验,我想出了一个解决方案。

    第 1 步:构建辅助指标表。这有两个目的:(a) 排除不相关的指标(如收入),以及 (b) 确保成本为负而节省为正。

    Metrics Table

    第 2 步:构建 2 个辅助度量,它们将进入虚拟的汇总中间表。

    CumulativeTotalMetric :=
    CALCULATE (
        SUMX (
            Impact,
            Impact[Latest Estimate Monthly Values]
                * RELATED ( BaseMetrics[Payback Period Multiplier] )
        ),
        FILTER ( ALL ( Impact[Month] ), Impact[Month] <= MAX ( Impact[Month] ) )
    )
    
    
    TotalMetric :=
    SUMX (
        Impact,
        Impact[Latest Estimate Monthly Values]
            * RELATED ( BaseMetrics[Payback Period Multiplier] )
    )
    

    第 3 步:创建创建虚拟表 (BaseTable) 的最终度量,并对其执行逻辑操作以达到最终投资回收期。

    Payback Period (Years) :=
    VAR BaseTable =
        ADDCOLUMNS (
            SUMMARIZE ( Impact, Impact[initiative #], Impact[snapshot], Impact[Month] ),
            "Cumulative Total Impact", CALCULATE ( [CumulativeTotalMetric] ),
            "Total Impact", CALCULATE ( [TotalMetric] )
        )
    VAR LastCumulativeLossDate =
        MAXX ( FILTER ( BaseTable, [Cumulative Total Impact] < 0 ), [Month] )
    VAR BreakEvenDate =
        MINX (
            FILTER (
                BaseTable,
                [Month] > LastCumulativeLossDate
                    && [Cumulative Total Impact] > 0
            ),
            [Month]
        )
    VAR InitialInvestmentDate =
        MINX ( FILTER ( BaseTable, [Total Impact] < 0 ), [Month] )
    RETURN
        IF (
            OR ( ISBLANK ( InitialInvestmentDate ), ISBLANK ( BreakEvenDate ) ),
            BLANK (),
            ( BreakEvenDate - InitialInvestmentDate )
                / 365
        )
    

    最后一个措施相当复杂。它使用渐进的因变量。它从同一个基表开始,并定义在后续变量中使用的变量。我不是 DAX 专家,但我怀疑使用这些变量有助于提高计算效率。

    编辑:我应该注意,我没有将此度量用作计算列——我只是在数据透视表中使用它,它与上面的“项目”表的“形状”相同——每个项目一行/ 倡议。

    【讨论】:

    • 您能检查一下您的代码示例吗?它们以某种方式包含一些 HTML。
    • 我使用了 DAXFormatter 工具,它生成了一些 HTML 来显示格式。我已经用常规代码替换了。我很想看看您对我的解决方案的看法。
    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2015-01-28
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多