【问题标题】:Rolling 6 month Open Contracts in Power BI在 Power BI 中滚动 6 个月未结合同
【发布时间】:2019-11-13 22:55:48
【问题描述】:

我需要显示在过去 6 个月中我们每个月有多少有效合同。我试图找出一种方法来显示这个。这是我的桌子

Machine Enrollment# StartDate   EndDate
A       1           1/2/2016    6/18/2019
B       2           12/15/2012  5/12/2034
C       3           3/25/2019   4/25/2021
D       4           1/7/2000    7/15/2019
A       5           10/1/2019   10/1/2025

我有数千行。我希望能够显示 6 个月滚动的视觉效果,了解有多少机器正在签订合同。所以在这个小例子中它看起来像这样

Apr-19  June-19  Jul-19  Aug-19  Sep-19  Oct-19
4       4        3       2       2       3

我什至从哪里开始创建这个?过去,我们只查看了当月的数字,并将这些结果添加到静态表的末尾,并删除了 6 个多月前的列。我已被分配在 Power BI 中自动执行此报告。我猜我需要创建一个列/度量来查看 EndDate 并将其与视觉中的过滤日期(即:8 月 19 日)进行比较,并确定当时合同是否打开。但是我不知道。任何帮助深表感谢。提前致谢!

【问题讨论】:

  • 10 月 19 日的数字是否正确?如果我理解正确的话,10 月 19 日的未平仓合约应该是 B 和 C。
  • 抱歉,我的机器 A 注册 5 的开始日期是 11 月。我将其更改为 10 月,以表明机器可以终止合同一两个月,然后重新签订合同

标签: powerbi dax


【解决方案1】:

我想我找到了您正在寻找的解决方案。您可以找到一个示例 pbix 文件here

1。创建日历表

需要一个日历表来过滤/分割时间段。日历表需要有唯一的Date列,以及YearQuarterMonth等可选列,具体取决于您在分析中需要的周期单位。

日历表可以最轻松地创建为 DAX 计算表。这是此用例中所需的最小日历表的示例。

Calendar = 
ADDCOLUMNS(
    CALENDAR( MIN( Contracts[StartDate] ), MAX( Contracts[EndDate] ) ),
    "Year Month", FORMAT( [Date], "mmm-yy" ),
    "Year Month Number", YEAR( [Date] ) * 100 + MONTH( [Date] )
)

2。创建一个度量来计算未平仓合约的数量

报告中计算和显示的每个数字都需要定义为度量

让我们考虑一下 May-19 的数量。当前筛选上下文包括日历表中 2019-05-01 和 2019-05-31 之间的所有 31 个日期。在这种情况下,我们怎么能想到一个开放的合约呢?如果合约在 2019-05-31 之后开始,则不开放。如果合约在 2019 年 5 月 1 日之前结束,它也不会开放。因此,未平仓合约满足此条件。

  • 在 2019 年 5 月 31 日或之前开始
  • 于 2019 年 5 月 1 日或之后结束

以下是根据此条件计算合同数量的度量定义。

# Open Contracts = 
VAR MinDate = MIN( 'Calendar'[Date] )
VAR MaxDate = MAX( 'Calendar'[Date] )
RETURN COUNTROWS(
    FILTER(
        Contracts,
        Contracts[StartDate] <= MaxDate
            && Contracts[EndDate] >= MinDate
    )
)

3。添加最近 6 个月的动态过滤器

如果我理解正确,要求是显示过去 6 个日历月的月数,不包括本月。我找不到一个直接的方法。我的解决方案可能包含一些 hacky 气味。

Power BI 没有基于相对于现在的日历月份的内置筛选器支持。我们需要构建一个自定义逻辑来实现这一点。我通过创建一个指示当前过滤器上下文是否在所需时间段内的度量来做到这一点。此度量是一个标志,如果过滤器上下文是过去 6 个日历月中包含的单个日历月,则返回 1,否则返回 BLANK。

__Last6MonthFlag = 
VAR YearMonths = CALCULATETABLE(
    VALUES( 'Calendar'[Year Month] ),
    REMOVEFILTERS( 'Calendar'[Year Month] ),
    'Calendar'[Date] > EOMONTH( TODAY(), -7 )
        && 'Calendar'[Date] <= EOMONTH( TODAY(), -1 )
)
RETURN IF(
    HASONEVALUE( 'Calendar'[Year Month] )
        && SELECTEDVALUE( 'Calendar'[Year Month] ) IN YearMonths,
    1
)

然后我像这样在视觉过滤器中使用了这个度量。

【讨论】:

  • 就是这样!完美运行。谢谢!
【解决方案2】:

您需要进行以下活动才能达到您的要求。

  1. 定义一个包含报告所有日期的日历表。为月-年定义一个计算列。 Month-Year = FORMAT('CalendarTable'[Date], "MM-YYYY")

  2. 您可以定义一个计算度量,如果合同的结束日期距离当前日期 TODAY() 函数)。此功能将有助于根据当前日期滚动计算。否则,此计算的度量将返回 NULL 并对它们求和。

  3. 您可以拖动在步骤号中定义的月-年计算列。 1、到柱轴。您可以将在第 2 步中定义的计算度量拖到值部分。 PowerBI 控件默认过滤掉 NULL 值。因此,当您使用步骤号中定义的计算度量时。 2,您将仅获得最近 6 个月的值。由于计算是基于TODAY() 定义的,因此它将是一个运行计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2023-03-09
    相关资源
    最近更新 更多