【问题标题】:Calculated Column with Current Row Values and Previous Dates in Power BI (DAX)Power BI (DAX) 中具有当前行值和先前日期的计算列
【发布时间】:2019-07-01 14:08:19
【问题描述】:

我正在尝试获取一个计算列(不是度量),该列基于该表当前行中的值获取列的总和,该日期比当前行上的日期滞后 1 个月。我的桌子上只有每个月的第一天的日期.. 这个月没有其他日子。我在问关于 DAX 的问题;但是,如果也有这样的解决方案,我在 Power Query 中用 M 语言实现(实际上可能更喜欢)没有问题。

我已经能够使用这样的东西来衡量工作..

CALCULATE(SUM(AMT), DATEADD(DATECOLUMN, -1, MONTH))

但我想成为一个新专栏。

假设表格看起来像这样..

A    B        C          D     AMT
6    BAC456   5/1/2019   TEST  25
2    EPS123   4/1/2019   TEST  45
2    EPS123   3/1/2019   TEST  65
6    BAC456   4/1/2019   TEST  43
6    BAC456   4/1/2019   TEST  88
7    GRE123   4/1/2019   TEST  90
9    BAC456   4/1/2019   TEST  43

我想在此表中添加另一列,第一行将是:

A    B         C          D      AMT   NEWCOL
6    BAC456    5/1/2019   TEST   25    131

第二行是:

A    B         C          D      AMT   NEWCOL
2    EPS123    4/1/2019   TEST   45    65

等等。

如果月份列是整个表中的第一个月,NEWCOL 将为 0

【问题讨论】:

  • 第 1 行的值不应该是 174 吗?
  • 否.. A、B 和 D 必须全部匹配

标签: powerbi dax calculated-columns


【解决方案1】:

要获得131,我假设您需要在AB 两列上进行匹配。

NewCol =
CALCULATE (
    SUM ( Table1[AMT] ),
    ALLEXCEPT ( Table1, Table1[A], Table1[B] ),
    PREVIOUSMONTH ( Table1[C] )
)

这对列AMT 求和,保持列AB 的行上下文,并将上个月指定为C 上的过滤器。请注意,对于没有上个月的行,这将返回一个空白。如果您更喜欢0,请在最后一个右括号后添加+ 0


如果PREVIOUSMONTH 不起作用,那么试试这个:

NewCol =
CALCULATE (
    SUM ( Table1[AMT] ),
    ALLEXCEPT ( Table1, Table1[A], Table1[B] ),
    Table1[C] = EOMONTH ( EARLIER( Table1[C] ), -2 ) + 1
)

对于date = 5/1/2019EOMONTH ( date, -2 ) 返回3/31/2019。加一天即可获得4/1/2019

【讨论】:

  • 我无法让它以这种方式工作。我认为时间智能函数是基于表中有连续日期或具有连续日期的相关日期维度表。在这种情况下,我都没有。我对 ALLEXCEPT 也不是很熟悉,但是您提出的模式非常简单,所以我不认为是造成问题的那部分。谢谢你的回复
  • 所以有一个我没有想到的问题。我希望它处理上个月的记录与当月不匹配的情况。我能想到的唯一方法是首先将这些行与当前月份日期和 AMT = 0 合并。然后上述公式将捕获当前月份的这些先前金额。你知道我怎么能做到这一点吗?在 SQL 中它将是 .... [ORIGINAL SET] UNION ALL SELECT A,B, CURRENT_MONTH, D, 0 FROM PREVIOUS_MONTH WHERE A||B||D NOT IN(SELECT A||B||D FROM CURRENT_MONTH)
【解决方案2】:

要在计算列中轻松实现这一点,您需要在编写最终 DAX 之前执行类似操作。

Month Num = MONTH(MyTable[C])
Month Diff = DATEDIFF(MyTable[C],MAX(MyTable[C]),MONTH)

现在您已经定义了这些月份差异和月份数字,您可以像这样编写 DAX -

Amount - New Column = 
Var selectedValue_B = MyTable[B]
Var SelectedValue_MonthDiff = MyTable[Month Diff]
Var out1 = CALCULATE(SUM(MyTable[AMT]), FILTER(ALL(MyTable), MyTable[Month Diff] = SelectedValue_MonthDiff+1 && MyTable[B] = selectedValue_B)) + 0
return out1

这让我的桌子看起来像,

我在公式中使用了 Var(Variables) 来帮助您了解公式中发生的情况。

如果它解决了您的问题,请接受答案。

【讨论】:

  • 这太完美了!谢谢
  • 这对1/1/2019 查找12/1/2018 有用吗?
  • 我应该更清楚。我试图指出,我认为您的衡量标准不会推广到跨越一个日历年的数据。
  • @AlexisOlson 现在找你。我看到了。再次更新。我认为这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多