动态计算平均成本的措施(避免循环依赖)

问题描述 投票:0回答:1

我导入了一个 Excel 表格,其中包含数千笔股票的买卖交易。

导入的数据:交易代码、交易日期、交易股票数量、交易类型(买入或卖出)以及交易股价

然后,我计算了一个度量,该度量能够在每行数据下发生每次购买/销售交易后计算运行的股票余额

其他 3 项措施也很容易计算:

  • 购买总额: 交易(购买)股票 x 股价
  • 总收入: 交易(出售)股票 x 股价
  • 总成本: 交易(出售)股票 x 平均成本

然后我需要计算最后一个衡量标准是平均成本,这就是我陷入循环依赖问题...

的地方

此计算背后的基本原理如下:

  • 如果交易是销售,只需从同一列中选择之前的平均成本
  • 但是 如果交易是购买,则 [截至相应日期的所有购买总额 相应的代码 + 相应日期之前的所有总成本(负) 相应的代码] 除以相应日期的股份余额

下面的屏幕截图试图说明上述所有内容(我希望它最终不会提供令人困惑的图片......):

由于实际代码相当冗长,我将其分为 4 部分,以便于理解。

1) 从同一列中选取的先前平均成本通过以下代码计算:

Average cost = 
VAR Avg_Cost_Tbl = 
    CALCULATETABLE( 
        ADDCOLUMNS( 
            SUMMARIZE( 
                fTrans, 
                fTrans[Ticker], 
                fTrans[Date] 
            ), 
            "@AvgCost", [Average cost]
        ), 
        fTrans[Ticker] = fTrans[Ticker], 
        fTrans[Date] <= fTrans[Date] 
    )
VAR Prior_Avg_Cost = 
    FILTER( 
        Avg_Cost_Tbl, 
        SELECTCOLUMNS( 
            OFFSET( 
                -1, 
                Avg_Cost_Tbl, 
                ORDERBY( fTrans[Ticker], ASC, fTrans[Date], ASC ) 
            ), 
            [@AvgCost] 
        )
    )

2) 截至相应日期的所有购买总额 相应代码通过以下代码计算:

VAR Purch_Total_Tbl =
    CALCULATETABLE( 
        ADDCOLUMNS( 
            SUMMARIZE( 
                fTrans, 
                fTrans[Ticker], 
                fTrans[Date], 
                fTrans[Transaction] 
            ), 
            "@PurchTotal", [Purchase total]
        ), 
        fTrans[Ticker] = fTrans[Ticker], 
        fTrans[Date] <= fTrans[Date], 
        fTrans[Transaction] = "Purchase"
    )
VAR Purch_Total_Sum = 
    IF( 
        HASONEVALUE( fTrans[Ticker] ), 
        SUMX( 
            WINDOW( 
                1, 
                ABS, 
                0, 
                REL, 
                Purch_Total_Tbl, 
                ORDERBY( fTrans[Date], ASC ), 
                , 
                PARTITIONBY( fTrans[Ticker] ) 
            ), 
            [@PurchTotal] 
        ) 
    )

3) 相应日期之前的所有总成本 相应代码通过以下代码计算:

VAR Total_Cost_Tbl =
    CALCULATETABLE( 
        ADDCOLUMNS( 
            SUMMARIZE( 
                fTrans, 
                fTrans[Ticker], 
                fTrans[Date], 
                fTrans[Transaction] 
            ), 
            "@Total_Cost", [Total cost]
        ), 
        fTrans[Ticker] = fTrans[Ticker], 
        fTrans[Date] <= fTrans[Date], 
        fTrans[Transaction] = "Sale"
    )
VAR Total_Cost_Sum = 
    IF( 
        HASONEVALUE( fTrans[Ticker] ), 
        SUMX( 
            WINDOW( 
                1, 
                ABS, 
                -1, 
                REL, 
                Total_Cost_Tbl, 
                ORDERBY( fTrans[Date], ASC ), 
                , 
                PARTITIONBY( fTrans[Ticker] ) 
            ), 
            [@Total_Cost] 
        ) 
    )

4) 最后,将上述 3 段代码通过以下代码组合在一起:

RETURN
    SUMX( 
        fTrans, 
        IF( 
            fTrans[Transaction] = "Sale", 
            Purch_Total_Sum, 
            DIVIDE( 
                Purch_Total_Sum + Total_Cost_Sum, 
                [Saldo de cotas] 
            ) 
        ) 
    )

但是后来我不断收到循环依赖错误消息我试图通过确保代码从先前的行中获取依赖数据来避免这种情况,尽管我尝试这样做失败了。

如何修复此代码以实现此目的?还是应该采取完全不同的计算方法?

我认为计算列可能是实现这一目标的一种方法,但我想避免这种途径,因为我们正在讨论一个包含数万行数据的表。

预先感谢您的帮助!

powerbi dax circular-dependency
1个回答
0
投票

VAR Total_Cost_Tbl = 计算表( 添加列( 总结( fTrans, fTrans[股票代码], fTrans[日期], fTrans[交易] ), "@Total_Cost", [总成本] ), fTrans[股票代码] = fTrans[股票代码], fTrans[日期] <= fTrans[Date], fTrans[Transaction] = "Sale" ) VAR Total_Cost_Sum = IF( HASONEVALUE( fTrans[Ticker] ), SUMX( WINDOW( 1, ABS, -1, REL, Total_Cost_Tbl, ORDERBY( fTrans[Date], ASC ), , PARTITIONBY( fTrans[Ticker] ) ), [@Total_Cost] ) )

© www.soinside.com 2019 - 2024. All rights reserved.