进一步划分已经很复杂的计算

Further Partitioning an Already Complex Calculation

在这里回答我之前的问题:

我有一条新的皱纹,我不太能解决。我本以为这很简单,甚至都不是问题,但我来了。

Alexis 为我制定了这个解决方案,计算每个 pipeline_event 的最终金额并将其加起来以获得准确的总计。我现在需要做的是显示根据给定时间段的最终概率值拆分的所有聚合数据。问题是相同的数据在更细粒度的多个位置出现,即使总计仍然是正确的。让我备份一下...

我们有 pipeline_history 条记录和 pipeline_event_history 条记录。我编写了一个 SQL 查询,将每个匹配对的它们拉到一行中。每行包含一个 'amount' 和一个 'eveprob'。后者是集合 {0,10,30,50,70,90,100} 中的一个数字,它反映了特定事件成功结束的概率。这些值位于名为 tblProb[Prob] 的链接 table 中。随着时间的推移,这两个值都可能会发生变化,因此我可能会得到一个特定事件的结果集,如下所示:

pipeline_id date_last_mod pipeline_event_id amount eveprob
P-03 1/1/2020 PE-04 200 10
P-03 3/1/2020 PE-04 200 30
P-03 5/1/2020 PE-04 200 30
P-03 5/15/2020 PE-04 400 50

我的数据透视表给我的是这样的:

Year/Month 0 10 30 50 70 90 100 Total
Jan 2020 200 200
Feb 2020 200 200
Mar 2020 200 200 200
Apr 2020 200 200 200
May 2020 200 400 400 400

我要的是这个:

Year/Month 0 10 30 50 70 90 100 Total
Jan 2020 200 200
Feb 2020 200 200
Mar 2020 200 200
Apr 2020 200 200
May 2020 400 400

这是我现在的衡量标准:

Revenue:=
VAR MaxDate = MAX ( qryDateTable[Date] )
RETURN
    SUMX (
        ADDCOLUMNS (
            CALCULATETABLE (
                SUMMARIZE (
                    qryPipelineUS,
                    qryPipelineUS[pipeline_id],
                    qryPipelineUS[pipeline_event_id]
                ),
                ALL ( qryDateTable )
            ),
            "temp",
                CALCULATE (
                    CALCULATE (
                        SUM ( qryPipelineUS[amount] ),
                        LASTNONBLANK (
                            qryPipelineUS[date_last_mod],
                            CALCULATE ( SUM ( qryPipelineUS[amount] ) )
                        )
                    ),
                    qryDateTable[Date] <= MaxDate
                )
        ),
        [temp]
    )

我尝试将 tblProb[Prob] 添加到 SUMMARIZE and/or 调整 CALCULATE(s) 以匹配过滤器上下文中的 Prob 值,但我要么做错了,要么就是错的方法。如果你能帮助我,我会欠你一大笔钱。谢谢。

我想通了!这是最终版本:

Revenue :=
VAR MaxDate =
    MAX ( tblDates[Date] )
RETURN
    SUMX (
        ADDCOLUMNS (
            CALCULATETABLE (
                SUMMARIZE (
                    qryPipelineUS,
                    qryPipelineUS[pipeline_id],
                    qryPipelineUS[pipeline_event_id]
                ),
                ALL ( tblDates )
            ),
            "temp",
                CALCULATE (
                    VAR LastProb =
                        CALCULATE (
                            CALCULATE (
                                CALCULATE (
                                    CALCULATE (
                                        MAX ( qryPipelineUS[eveProb] ),
                                        LASTNONBLANK (
                                            qryPipelineUS[date_last_mod],
                                            CALCULATE ( SUM ( qryPipelineUS[amount] ) )
                                        ),
                                        ALL ( tblDates ),
                                        tblDates[Date] <= MaxDate
                                    )
                                ),
                                ALL ( tblProb )
                            ),
                            ALL ( tblDates ),
                            tblDates[Date] <= MaxDate
                        )
                    RETURN
                        CALCULATE (
                            SUM ( qryPipelineUS[amount] ),
                            LASTNONBLANK (
                                qryPipelineUS[date_last_mod],
                                CALCULATE ( SUM ( qryPipelineUS[amount] ) )
                            ),
                            tblProb[Prob] = LastProb
                        ),
                    tblDates[Date] <= MaxDate
                )
        ),
        [temp]
    )

诀窍在于以正确的方式在正确的位置计算 LastProb 变量。一开始我试着计算它,但这对聚合不起作用,因为它需要为每个事件计算不同的值。我很惊讶它需要这么多嵌套的计算,但我一直试图削减它,但它并没有那样工作。如果您有任何见解,请插话。

这是你的解决方案,去掉了一些冗余:

Revenue := 
VAR MaxDate = MAX ( tblDates[Date] )
RETURN
    SUMX (
        ADDCOLUMNS (
            CALCULATETABLE (
                SUMMARIZE (
                    qryPipelineUS,
                    qryPipelineUS[pipeline_id],
                    qryPipelineUS[pipeline_event_id]
                ),
                ALL ( tblDates )
            ),
            "temp",
                CALCULATE (
                    VAR LastProb =
                        CALCULATE (
                            CALCULATE (
                                MAX ( qryPipelineUS[eveProb] ),
                                LASTNONBLANK (
                                    qryPipelineUS[date_last_mod],
                                    CALCULATE ( SUM ( qryPipelineUS[amount] ) )
                                ),
                                ALL ( tblDates )
                            ),
                            ALL ( tblProb )
                        )
                    RETURN
                        CALCULATE (
                            SUM ( qryPipelineUS[amount] ),
                            LASTNONBLANK (
                                qryPipelineUS[date_last_mod],
                                CALCULATE ( SUM ( qryPipelineUS[amount] ) )
                            ),
                            tblProb[Prob] = LastProb
                        ),
                    tblDates[Date] <= MaxDate
                )
        ),
        [temp]
    )

(作为解决方案发布,因为它不能作为评论使用。)