使用DAX

时间:2018-04-05 16:40:07

标签: dax powerpivot

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

Impact Table Project Table

我试图在DAX中构建一个计算列,以确定Project表中每个项目的投资回收期。我在这里整理了计算,我还不确定如何在DAX中执行此操作。

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

  1. 对于每个项目,找到相关指标的每个日期的累计金额(包括OpEx储蓄和运营成本,但不包括收入或营运资金)

  2. 查找累计金额大于零的最短日期("收支平衡"日期"

  3. 查找具有非零实施成本的MIN日期("投资日期"

  4. 找出差异(以月计)#2和#3 以确定投资回收期

  5. 编辑:

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

    Answer

2 个答案:

答案 0 :(得分:0)

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

步骤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专家,但我怀疑使用这些变量有助于提高计算效率。

编辑:我应该注意到我没有将此度量用作计算列 - 我只是在一个相同的数据透视表中使用它&#34;形状&#34;作为&#34;项目&#34;上表 - 每个项目/倡议一行。

答案 1 :(得分:0)

我已将此作为解决方案制作:

  1. 创造价值,确保成本 - 节省+(ValCorr)
  2. 创建一个运行总和(RunningSum)
  3. 查找投资日期(InvestmentDate)
  4. 查找盈亏日期(BreakEvenDate)
  5. 找出差异(回报)
  6. 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)
    

    结果: Result

    祝你好运!