【问题标题】:Calculate Current and Previous month's Value based on slicer selection in power bi根据 power bi 中的切片器选择计算当前和上个月的值
【发布时间】:2020-12-09 19:58:59
【问题描述】:

我有两个表叫

  • 主表包含以下数据(图片)和
  • 使用主表中的日期创建的日期表。

我想根据 日期表

中的日期切片器选择来计算两个字段/度量
  • 当月收入
  • 上个月的收入

示例:如果我选择第 4 个月,那么它应该将客户 A 和 B 在第 4 个月的不同收入相加为 current_month_revenue,并将 A 和 B 在第 3 个月的不同收入相加为 previous_month_revenue

我尝试编写以下度量来计算 current_month_revenue,它工作正常,但它没有为 Previous_month_revenue 提供正确的结果。 我也得到了上个月的相同值。

'Measure Previous Month Revenue' =
IF (
    ISFILTERED ( 'Date'[Year_Month] ),
    VAR myTable =
        SUMMARIZE (
            'Main Table',
            'Main Table'[ClientName],
            'Main Table'[Mon],
            'Main Table'[Revenue]
        )
    RETURN
        CALCULATE (
            SUMX (
                myTable,
                'Main Table'[Revenue]
            ),
            FILTER (
                'Main Table',
                'Main Table'[Mon]
                    = SELECTEDVALUE ( 'Date'[Month] - 1 )
            )
        ),
    VAR myTable =
        SUMMARIZE (
            'Main Table',
            'Main Table'[Revenue],
            'Main Table'[Mon],
            'Main Table'[Revenue]
        )
    RETURN
        SUMX (
            FILTER (
                myTable,
                'Main Table'[Mon]
                    = MONTH (
                        TODAY ()
                    ) - 1
            ),
            'Main Table'[Revenue]
        )
)

期望的输出

如果选择第 4 个月

  • 当前 Moth 收入 = 100 + 200 = 300
  • 上个月 = 100+200 = 300

在这种情况下,两者相同,但在实际数据中,每个月的收入不同。

【问题讨论】:

  • 这将有助于回答者以文本形式而不是图像形式呈现您的数据。

标签: powerbi dax powerquery


【解决方案1】:

我从代码中看到“日期”表有一个名为“月份”的数字列,我假设它与“主表”中的“周一”列的类型相同。

另外,由于在“主表”中没有年份,我假设不考虑年份。

从日期表的切片器中,我们可以使用 SELECTEDVALUE() 直接获取选定的“日期”[月份]。我们使用 TODAY() 函数获取的当前月份作为默认参数。

然后我们从 Selected Month 中减去一个 Previous Month,我们可以使用它来对按 CustomerName、Mon 和 Revenue 分组的表进行切片。需要分组来删除同一客户在同一个月的重复收入,并使用 SUMMARIZE() 实现

作为最后一步,我们可以使用 SUMX 聚合过滤和分组表的“主表”[Revenue]。

'Measure Previous Month Revenue' = 
VAR CurrentMonth =
    MONTH(
        TODAY()
    )
VAR SelectedMonth =
    SELECTEDVALUE(
        'Date'[Month],
        CurrentMonth
    )
VAR PrevMonth = SelectedMonth - 1   
VAR MyTable =
    CALCULATETABLE(
        SUMMARIZE(
            'Main Table',
            'Main Table'[ClientName],
            'Main Table'[Mon],
            'Main Table'[Revenue]
        ),
        'Main Table'[Mon] = PrevMonth,
        REMOVEFILTERS( 'Date' )
    )
VAR Result =
    SUMX(
        MyTable,
        'Main Table'[Revenue]
    )
RETURN
    Result

可以为当前月份编写相同的代码,但用于上一月份的计算

'Measure Current Month Revenue' = 
VAR CurrentMonth =
    MONTH(
        TODAY()
    )
VAR SelectedMonth =
    SELECTEDVALUE(
        'Date'[Month],
        CurrentMonth
    )
VAR MyTable =
    CALCULATETABLE(
        SUMMARIZE(
            'Main Table',
            'Main Table'[ClientName],
            'Main Table'[Mon],
            'Main Table'[Revenue]
        ),
        'Main Table'[Mon] = SelectedMonth,
        REMOVEFILTERS( 'Date' )
    )
VAR Result =
    SUMX(
        MyTable,
        'Main Table'[Revenue]
    )
RETURN
    Result

可以通过设置“日期”表和“主表”之间的关系来实施更好的解决方案。 根据业务需求,可以使用月级别粒度的 Date 表,使用 YearMonth 列而不是 Mon,或者在 Day 级别,使用 Date 列而不是 Mon 列。

【讨论】:

  • 使用上述方法,该措施给出了正确的结果,切片器上没有选择任何内容,但如果我选择其他月份,我会变得空白。注意:我的切片器是使用日期表中的年月字段创建的
  • 好的,所以“主表”上有一个日期列,以及该列与“日期”[日期]之间的关系。然后可以通过删除“日期”上的过滤器来更改此度量
  • 耶!!它正在工作,谢谢@sergiom 感谢您的帮助。 REMOVEFILTERS( 'Date' ) 是缺失的部分。你能帮我理解为什么我们使用这条线吗?
  • 我们需要去掉Date表和主表的关系引入的过滤。这是因为切片器中的选择会按照关系从日期表传播到主表。但是我们想在 Mon 列上应用一个过滤器,因此我们必须摆脱这个过滤器,并且 REMOVESFILTERS('Date') 这样做:它删除从 Date 表传播到 Main 表的过滤器。 REMOVEFILTERS 的效果是应用它的 CALCULATE 函数的局部。删除过滤器后,将应用 Mon 列上的过滤器。
  • 知道模型包含 Date 表和 Main Table 表之间的关系将允许编写利用时间智能函数的度量,而无需使用 Mon 列。但这将是一个不同的问题,其中包含模型的描述、日期表的粒度以及 Mon 列包含用于关系的日期的同一月份的确认。
【解决方案2】:

CALCULATE 不会影响您已经定义的变量,因此 FILTER 对第一个 SUMX 没有任何作用。请参阅this related post 了解更多详细信息。


我建议更简单地编写度量。像这样的:

Previous Month Revenue =
VAR PrevMonth =
    SELECTEDVALUE (
        'Date'[Month],
         MONTH ( TODAY () )
    ) - 1
RETURN
    CALCULATE (
        SUM ( 'Main Table'[Revenue] ),
        'Main Table'[Mon] = PrevMonth
    )

【讨论】:

  • 是的..将它与上述一起使用以获得所需的结果。
猜你喜欢
  • 1970-01-01
  • 2022-08-22
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多