dax从另一列减去值

时间:2019-03-11 18:04:48

标签: dax

在以下情况下,我需要您的帮助,我们在日期,A和B列中有数据。

我需要类似“结果”列的输出

步骤:

AB =结果

然后从Result中取值-B的下一行值

直到结果值变为零为止。

一旦得到零,则需要将结果的先前值除以B的对应值。我突出显示为红色。

这应该是合理的。不是按计算列。

enter image description here

1 个答案:

答案 0 :(得分:1)

我要说的是,您想要的结果有点令人困惑。首先,您要在屏幕截图中显示“结果”列之类的输出。但是后来您说要对红色数字进行除法。幸运的是,要进行除法,“结果”列需要进行计算(至少以某种方式),因此这两个都是如此。

首先是“结果”列(实际上是度量)。

关键在于将问题简化为最简单的数学术语。任何给定行的结果列中的数字是A列中的最大日期值,减去该日期直到给定行中日期为止的B列总和(直到我们达到或低于0)。

首先,我们需要知道给定行的日期

    VAR SelectedDate = SELECTEDVALUE(Data[Date])

那么我们将需要知道最大日期。

    VAR MaxDate = MAXX(ALLSELECTED(Data), [Date])

现在我们知道了最大日期,我们可以从A列获取该日期的值。

    VAR MaxDateA = SUMX(FILTER(ALL(Data), [Date] = MaxDate), [A])

有了这三个部分,我们就可以创建我们的运行总计。取最大日期的A列值,然后减去最大日期和所选日期(包括该日期)之间所有日期的B列之和。

        MaxDateA - SUMX(FILTER(ALL(Data), [Date] >= SelectedDate && [Date] <= MaxDate), [B])

现在,我们只需要处理结果达到或低于0的情况。我们可以编写一个简单的if语句,看起来与上面的运行总数非常相似,只需要简单的更改即可;排除所选日期。基本上是在检查前一个日期的运行总计是否仍大于0,然后计算给定日期的运行总计。

    IF(
        MaxDateA - SUMX(FILTER(ALL(Data), [Date] > SelectedDate && [Date] <= MaxDate), [B]) > 0,
        MaxDateA - SUMX(FILTER(ALL(Data), [Date] >= SelectedDate && [Date] <= MaxDate), [B])
        BLANK()
    )

这是一个公式。

Result = 
    VAR SelectedDate = SELECTEDVALUE(Data[Date])
    VAR MaxDate = MAXX(ALLSELECTED(Data), [Date])
    VAR MaxDateA = SUMX(FILTER(ALL(Data), [Date] = MaxDate), [A])

RETURN
    IF(
        MaxDateA - SUMX(FILTER(ALL(Data), [Date] > SelectedDate && [Date] <= MaxDate), [B]) > 0,
        MaxDateA - SUMX(FILTER(ALL(Data), [Date] >= SelectedDate && [Date] <= MaxDate), [B]),
        BLANK()
    )

Result column


接下来是划分度量。

我们将使用与第一部分相同的逻辑。在这种情况下,“已选择”用于给定的行上下文,因此它将替换上面的“最大”功能。

    VAR SelectedDate = SELECTEDVALUE(Data[Date])
    VAR SelectedA = SUM(Data[A])

选择日期后,我们可以生成一个临时表,该表将保存我们的运行总计。基本上,我们将从数据表中获取不同的日期列表,并添加一列(称为“结果”),该列的定义与第一部分的公式非常相似。

    VAR OlderDatesList = SUMMARIZE(FILTER(ALL(Data), [Date] <= SelectedDate), [Date], "Result", SelectedA - SUMX(FILTER(ALL(Data), [Date] <= SelectedDate && [Date] >= EARLIER([Date])), [B]))

有了此列表,我们可以找到跑步总数达到(或低于)0时的阈值。从这一点开始,我们想知道达到阈值的日期,该日期之前的跑步总数以及值该日期的B列。

    VAR LastSelectedDate = MAXX(FILTER(OlderDatesList, [Result] <= 0), [Date])
    VAR PriorSelectedResult = SUMX(FILTER(OlderDatesList, [Date] = MINX(FILTER(OlderDatesList, [Date] > LastSelectedDate), [Date])), [Result])
    VAR LastSelectedB = SUMX(FILTER(ALL(Data), [Date] = LastSelectedDate), [B])

我们现在都有两个工作要做。

    DIVIDE(PriorSelectedResult, LastSelectedB, BLANK())

同样,这是一个公式。

Division = 
    VAR SelectedDate = SELECTEDVALUE(Data[Date])
    VAR SelectedA = SUM(Data[A])
    VAR OlderDatesList = SUMMARIZE(FILTER(ALL(Data), [Date] <= SelectedDate), [Date], "Result", SelectedA - SUMX(FILTER(ALL(Data), [Date] <= SelectedDate && [Date] >= EARLIER([Date])), [B]))
    VAR LastSelectedDate = MAXX(FILTER(OlderDatesList, [Result] <= 0), [Date])
    VAR PriorSelectedResult = SUMX(FILTER(OlderDatesList, [Date] = MINX(FILTER(OlderDatesList, [Date] > LastSelectedDate), [Date])), [Result])
    VAR LastSelectedB = SUMX(FILTER(ALL(Data), [Date] = LastSelectedDate), [B])

RETURN
    DIVIDE(PriorSelectedResult, LastSelectedB, BLANK())

Divison


编辑:根据评论,这是在“结果”值达到(或低于)0之前获得行数的最后一块。

此段的逻辑开始于“除法”度量,因为我们也需要OlderDatesList进行此计算。有了该列表后,我们只需要检查“结果”列是否达到(或低于)0,如果达到,则返回该点之前的行数。

Count before Zero = 
    VAR SelectedDate = SELECTEDVALUE(Data[Date])
    VAR SelectedA = SUM(Data[A])
    VAR OlderDatesList = SUMMARIZE(FILTER(ALL(Data), [Date] <= SelectedDate), [Date], "Result", SelectedA - SUMX(FILTER(ALL(Data), [Date] <= SelectedDate && [Date] >= EARLIER([Date])), [B]))

RETURN
    IF(
        COUNTAX(FILTER(OlderDatesList, [Result] <= 0), [Date]) >= 1,
        COUNTAX(FILTER(OlderDatesList, [Result] > 0), [Date]),
        BLANK()
    )

Count measure