如何构建DAX度量来计算特定月份的YTD值之和?
这里我们将FactTable按月分组。 FactTable充满了实际数据和预测数据。知道何时实际结束的唯一方法是[年末截止日期]列[年末截止日期]中的信息。在[年终截止日期]列[年末截止日期]中 - 它是一个单值表 - 我们有一个有趣的选择月份,我们希望看到YTD的计算。在我们的例子中,它是三月。 FactTable每月不定期更新,通常延迟一个月。由于不规则更新,无法将其链接到TODAY等时间函数。
我们希望在黄色Card Visual中显示正确的YTD值[月末] [YTD]。当我们在" 2018-03"上点击切片机时我们几乎得到了我们想要的东西 - 在黄牌中正确值为66。但是这种解决方案不是自动的。我想在[年末]月份变化时自动查看正确的值,在我们的情况下是4月或5月。我不希望用户完成它。
我可以从文件DAX YTD.pbix
下载我的绝望努力我以各种方式追捕鹿:
感谢您的帮助。
在赏金之前更新。 走向更高的水平。我已经向FactTable引入了一个Category列。请下载DAX YTD by category.pbix。所以过滤现在变得更加复杂。我想为苹果类别提供正确的YTD数据。
答案 0 :(得分:3)
您是否使用了Date
表格中的Calendar
列,而不是FactTable
中的列?
如果您使用FactTable
中的日期列,当您在日期应用过滤器时,它将过滤3月份的事实记录,然后进行计算,结果{{1 }}
如果您使用33
中的那个,当您对其应用过滤器时,它会过滤Calendar
上的记录(您希望在图表中显示),因此基础计算仍然会保持完整。
一个工作示例:
Calendar
我建议您更改度量的计算,以避免在某些情况下丢失值:
Calendar = CALENDAR(DATE(2010, 1, 1), DATE(2020, 12, 31))
更新:
我现在想要达到的目标更加清晰,但对我来说似乎仍然是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
表拖到黄牌的可视化级别过滤器并添加相对日期过滤,则应如下所示:
对于Calendar
视觉效果,您可以使用following measure获取上个日历月的第一天,因此您无需为其创建另一个表:
End of YTD
希望这是你想要实现的目标:
Updated file供您参考。
再次更新:
我认为您必须编写自己的End of YTD = EOMONTH(TODAY(), -2) + 1
计算而不是使用内置计算,以便您可以使用在另一个表中定义的截止日期。在这里,我假设您在YTD
中只有一行。请注意,我已将'Cut off date'[End of YTD]
添加到过滤器中,以便黄卡保持不变(66),而不是在单击其他行/过滤器时显示空白:
ALL()
答案 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
)