在DAX中测量以仅为Power BI计算所选月份的YTD

时间:2018-04-09 08:17:19

标签: powerbi dax measure

如何构建DAX度量来计算特定月份的YTD值之和?

这里我们将FactTable按月分组。 FactTable充满了实际数据和预测数据。知道何时实际结束的唯一方法是[年末截止日期]列[年末截止日期]中的信息。在[年终截止日期]列[年末截止日期]中 - 它是一个单值表 - 我们有一个有趣的选择月份,我们希望看到YTD的计算。在我们的例子中,它是三月。 FactTable每月不定期更新,通常延迟一个月。由于不规则更新,无法将其链接到TODAY等时间函数。

enter image description here enter image description here 我们希望在黄色Card Visual中显示正确的YTD值[月末] [YTD]。当我们在" 2018-03"上点击切片机时我们几乎得到了我们想要的东西 - 在黄牌中正确值为66。但是这种解决方案不是自动的。我想在[年末]月份变化时自动查看正确的值,在我们的情况下是4月或5月。我不希望用户完成它。

我可以从文件DAX YTD.pbix

下载我的绝望努力

我以各种方式追捕鹿:

  1. 在DAX度量中使用 FILTER 功能。但似乎是 FILTER功能很苛刻。它首先应用于事实表, 只选择一个月,然后错误地计算YTD值。因此,如果 对于强制执行计算和过滤的顺序,会有任何选项 是希望。
  2. 我尝试了 SWITCH 功能来显示正确的结果 特定月份和0或其他月份为null。虽然我 在这方面取得成功,我无法利用它。当它 来过滤我和以前一样无望。顺便说一下,我可以 如果SWITCH在表的末尾产生了总数,那就成功了 才不是。令人惊讶的。
  3. 我希望 RELATED 功能在[Cut off date]表中显示正确的结果。到目前为止,我还没有走出迷雾。
  4. 感谢您的帮助。

    在赏金之前更新。 走向更高的水平。我已经向FactTable引入了一个Category列。请下载DAX YTD by category.pbix。所以过滤现在变得更加复杂。我想为苹果类别提供正确的YTD数据。

3 个答案:

答案 0 :(得分:3)

您是否使用了Date表格中的Calendar列,而不是FactTable中的列?

如果您使用FactTable中的日期列,当您在日期应用过滤器时,它将过滤3月份的事实记录,然后进行计算,结果{{1 }}

如果您使用33中的那个,当您对其应用过滤器时,它会过滤Calendar上的记录(您希望在图表中显示),因此基础计算仍然会保持完整。

一个工作示例:

Calendar

date

我建议您更改度量的计算,以避免在某些情况下丢失值:

Calendar = CALENDAR(DATE(2010, 1, 1), DATE(2020, 12, 31))

results

更新:

我现在想要达到的目标更加清晰,但对我来说似乎仍然是XY problem

我知道您希望按原样显示仪表板,这样用户每次都不需要点击/输入以查看他们应该看到的内容。这就是为什么我不知道为什么你需要创建一个新表来存储Total = SUM(FactTable[Value]) MTD = TOTALMTD([Total], 'Calendar'[Date]) YTD = TOTALYTD([Total], 'Calendar'[Date]) 的原因。如何自动维护?

上面的Cut off date (End of YTD)解决方案实际上仍然适用于您共享的.pbix文件。如果您将relative date filtering列从Date表拖到黄牌的可视化级别过滤器并添加相对日期过滤,则应如下所示:

yellow card

对于Calendar视觉效果,您可以使用following measure获取上个日历月的第一天,因此您无需为其创建另一个表:

End of YTD

希望这是你想要实现的目标:

final result

Updated file供您参考。

再次更新:

我认为您必须编写自己的End of YTD = EOMONTH(TODAY(), -2) + 1 计算而不是使用内置计算,以便您可以使用在另一个表中定义的截止日期。在这里,我假设您在YTD中只有一行。请注意,我已将'Cut off date'[End of YTD]添加到过滤器中,以便黄卡保持不变(66),而不是在单击其他行/过滤器时显示空白:

ALL()

ytd special

答案 1 :(得分:1)

我会通过在Calendar表中添加一个计算列来将每行分类为“YTD”或“Other”来解决此问题,例如

Is YTD =
IF (
    [Date] >= DATE ( YEAR ( DISTINCT ( 'Cut off date'[End of YTD] ) ), 1, 1 )
        && [Date] <= DISTINCT ( 'Cut off date'[End of YTD] ),
    "YTD",
    "Other"
)

然后我会将新的是YTD 字段添加到您的Card视觉的可视级别过滤器中,然后从基本过滤列表中选择 YTD 。显示的度量可以是您的简单总计度量:SUM(FactTable [Value])。

这是一种比任何特定体操体操更灵活,更灵活的解决方案。您不需要采取大量措施来在每个基础测量之上应用所需的逻辑 - 它们都将自然地工作。您可以在任何级别应用过滤器:Visual,Page,Report,或将其放在切片器中以供最终用户控制。

我更喜欢返回文字结果,例如“YTD”/“其他”(而不是1/0,真/假或是/否),因为这允许容易地扩展到其他要求,例如“YTD之前”(2017年1月1日至2017年3月1日)。在视觉效果中使用时也更清晰。

实际上我不应该声称这个设计的功劳 - 这大致遵循了Cognos Transformer的相对时间功能在90年代的功能。

答案 2 :(得分:-1)

我在定期/年初至今的报告(最后一张)中做了这样的事情:http://ciprianbusila.ro/

我使用了所选月份的索引值(范围1-12),并以此为基础,使用max函数创建了一个度量,请参见以下代码:

ACT = var 
ACT_periodic=calculate([Value],Scenarios[Scenario]=values(Scenarios[Scenario]))

var max_month=max(Periods[Period Order])
var ACT_YTD=CALCULATE([Value],Scenarios[Scenario]=VALUES(Scenarios[Scenario]),all(Periods[Month]),Periods[Period Order]<=max_month)

var myselection=if(HASONEVALUE(MRD_view[.]),values(MRD_view[.]),"PERIODIC")
return
switch(
true(),
myselection="PERIODIC",ACT_periodic,
myselection="YEAR TO DATE",ACT_YTD,

ACT_periodic
)