在 DAX 中测量以计算仅适用于 Power BI 的所选月份的 YTD
Posted
技术标签:
【中文标题】在 DAX 中测量以计算仅适用于 Power BI 的所选月份的 YTD【英文标题】:Measure in DAX to calculate YTD for chosen month only for Power BI 【发布时间】:2018-09-18 13:57:29 【问题描述】:如何构建 DAX 度量来计算特定月份的 YTD 值的总和?
这里我们有按月分组的 FactTable。 FactTable 填充了实际数据和预测数据。了解实际结束时间的唯一方法是表 [截止日期] 列 [YTD 结束] 中的信息。在 [End of YTD] 列中的表 [Cut of date] 中——它是一个单值表——我们选择了有趣的月份,我们希望查看 YTD 的计算。在我们的例子中,它是三月。 FactTable 每月不定期更新,通常延迟一个月。由于不定期更新,无法将其链接到像 TODAY 这样的时间函数。
我们希望在 [YTD 结束] 月份的黄牌视觉中显示正确的 YTD 值。当我们点击“2018-03”上的切片器时,我们几乎得到了我们想要的——黄牌中的正确值 66。然而,这个解决方案不是自动的。我希望在 [YTD 结束] 月份发生变化时自动查看正确的值,在我们的例子中是四月或五月。我不希望它由用户完成。
我拼命的努力可以从文件下载:DAX YTD.pbix
我以各种方式追逐鹿:
-
通过在 DAX 度量中使用 FILTER 函数。但似乎
FILTER 功能太苛刻了。它首先应用于事实表,
只选择了一个月,然后错误地计算了 YTD 值。因此,如果
会有强制计算和过滤顺序的任何选项,会有
成为希望。
我尝试了 SWITCH 功能来显示正确的结果
特定月份和 0 或 null 其他月份。虽然我
成功了,我无法利用它。当它
来到过滤我和以前一样绝望。顺便说一句,我能
如果 SWITCH 在表的末尾产生总计,则使其成为
才不是。令人惊讶。
我寄希望于 RELATED 函数在 [截止日期] 表中显示正确的结果。到目前为止,我还没有走出迷雾。
感谢您的帮助。
赏金前更新。 走向更高的层次。我在 FactTable 中引入了一个 Category 列。请下载DAX YTD by category.pbix。所以过滤现在变得更加复杂。我想为 Apples 类别提供正确的 YTD 数据。
【问题讨论】:
【参考方案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
)
【讨论】:
【参考方案2】:我会通过在日历表中添加一个计算列来解决此问题,将每一行分类为“YTD”或“其他”,例如
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"
)
然后,我会将新的 Is YTD 字段添加到卡片视觉对象的视觉级别过滤器中,并从基本过滤列表中选择 YTD。显示的度量可以是您的简单 Total 度量:SUM(FactTable[Value])。
这是一个比任何特定的体操都更加灵活和可重复使用的解决方案。您不需要大量的措施来在每个基本措施之上应用所需的逻辑——它们都会自然而然地工作。您可以在任何级别应用过滤器:视觉、页面、报告,或将其放入切片器中以供最终用户控制。
我更喜欢返回文本结果,例如“YTD”/“Other”(而不是 1/0、True/False 或 Yes/No),因为这样可以轻松扩展其他要求,例如“年初至今”(2017 年 1 月 1 日至 2017 年 3 月 1 日)。在视觉效果中使用时也更清晰。
实际上,我不应该将这个设计归功于我 - 这大致遵循了 Cognos Transformer 的相对时间功能在 90 年代的工作方式。
【讨论】:
你能解释一下你的公式中的逻辑是什么吗?为什么不简单地比较日期 Calendar.Date >='Cut off date'[End of YTD] ?为什么要使用 Distinct? 这是一个计算列,而不是一个度量。因此,对另一个表中的列的裸引用不是有效的语法。当您有一个像“截止日期”这样的单行表时,DISTINCT 是一个方便的快捷函数来获取单个值。 如何修改您的 dax 度量,以便将Cut off date'[End of YTD]
更改为 EOMONTH? Cut off date'[End of YTD]
存储为当月的第一天,即 2018-03-01,尽管它表示 3 月 31 日。
如果你想用 MAX 或其他函数来获取单个值而不是不同的值,那么你的 dax 度量应该如何修改?假设我们有不同的 YTD 类别。
对于月末,只需将字段包装在 ENDOFMONTH 函数中,例如Is YTD = IF ( [Date] >= DATE( YEAR( DISTINCT( 'Cut off date'[End of YTD] ) ) , 1 , 1 ) && [Date] <= DISTINCT( ENDOFMONTH( 'Cut off date'[End of YTD] ) ) , "YTD" , "Other" )
【参考方案3】:
您是否使用了Calendar
表中的Date
列,而不是FactTable
中的列?
如果你使用FactTable
中的日期列,当你对日期应用过滤器时,它会过滤3月份的事实记录,然后再进行计算,结果是33
。
如果您使用来自Calendar
的记录,当您对其应用过滤器时,它会过滤Calendar
上的记录(您希望在图表中显示),因此基础计算仍将保持不变。
一个工作示例:
Calendar = CALENDAR(DATE(2010, 1, 1), DATE(2020, 12, 31))
我建议您更改度量的计算以避免在某些情况下出现缺失值:
Total = SUM(FactTable[Value])
MTD = TOTALMTD([Total], 'Calendar'[Date])
YTD = TOTALYTD([Total], 'Calendar'[Date])
更新:
对我来说,您现在想要实现的目标更加清晰,但在我看来,它仍然是 XY problem。
我了解您希望按原样显示仪表板,以便用户无需每次都单击/输入来查看他们应该看到的内容。这就是为什么我不明白为什么需要创建一个新表来存储Cut off date (End of YTD)
。如何自动维护?
上面的relative date filtering
解决方案实际上仍然适用于您共享的 .pbix 文件。如果您将Date
列从Calendar
表拖到黄牌的可视级别过滤器并添加相对日期过滤,它应该如下工作:
对于End of YTD
视觉对象,您可以使用following measure 获取上一个日历月的第一天,因此您无需为其创建另一个表:
End of YTD = EOMONTH(TODAY(), -2) + 1
希望这是您想要实现的目标:
Updated file供您参考。
再次更新:
我认为您必须编写自己的 YTD
计算而不是使用内置的计算,以便您可以使用在另一个表中定义的截止日期。在这里,我假设您在'Cut off date'[End of YTD]
中只有一行。请注意,我已将ALL()
添加到过滤器中,以便在单击其他一些行/过滤器时黄牌保持不变(66)而不是显示空白:
YTD_Special =
CALCULATE(
[Total],
FILTER(
ALL(FactTable),
FactTable[Date] >= DATE(YEAR(VALUES('Cut off date'[End of YTD])), 1, 1) &&
FactTable[Date] <= VALUES('Cut off date'[End of YTD])
)
)
【讨论】:
您是否还按 Calendar.Date 过滤? 2018 年我有 12 个月的时间,所以我不能像你那样使用相对过滤,因为我会在 12 月结束。我有另一个第三个表,它只有 CurrentMonth=2018-02-01 的值 你到底想达到什么目的?我以为你已经给出了精确的要求,但我现在很困惑。对于相对日期过滤,Calendar
表中有多少个日期并不重要。如您所见,我的Calendar
表包含从 2010 年到 2020 年的所有日期,但相对日期过滤是参考 Now
(2018-04-09 或 2018-04-10 取决于您的时区),而不是表中的任何日期。
很抱歉第一次没有具体说明。我已经大大修改了我的问题。我将非常感谢任何小提示。感谢您抽出宝贵的时间。
蜂王必须做报告。蜂王不会点击任何切片器。 FactTable 填充了实际数据和预测数据。另一只工作蜜蜂(不是我)将在适当的时候加载新的实际数据。您需要Cut off date (End of YTD)
才能知道实际结束和预测何时开始。黄色视觉仅用于实际。 Cut off date (End of YTD)
和真实日历之间没有联系。工作蜜蜂可能会在日历月结束后 10 天或 25 天后加载新的实际数据。所以我必须从表中获取过滤器。
@PrzemyslawRemin 我理解你的沮丧。也许更改方法更容易,以便它适用于这种特殊情况。请检查上面的更新。以上是关于在 DAX 中测量以计算仅适用于 Power BI 的所选月份的 YTD的主要内容,如果未能解决你的问题,请参考以下文章
POWER BI - 递归计算我的 dax 度量的解决方法?