在 DAX 中进行测量以仅针对 Power BI 计算所选月份的 YTD
Measure in DAX to calculate YTD for chosen month only for Power BI
如何构建 DAX 度量来计算特定月份的 YTD 值之和?
这里我们有按月分组的 FactTable。 FactTable 填充了实际数据和预测数据。了解实际结束时间的唯一方法是 table [截止日期] 列中的 [年初至今结束] 中的信息。在 table [截止日期] 的 [End of YTD] 列中 - 它是一个单一值 table - 我们选择了有趣的月份,我们希望看到 YTD 的计算。在我们的例子中是三月。 FactTable 每月不定期更新,通常会延迟一个月。由于更新不规律,无法将其链接到像TODAY这样的时间函数。
我们希望在黄色 Card Visual 中为月份 [End of YTD] 显示正确的 YTD 值。当我们点击“2018-03”上的切片器时,我们几乎得到了我们想要的——黄卡中的正确值 66。但是,此解决方案不是自动的。我想在 [End of YTD] 月份更改时自动查看正确的值,在我们的例子中是四月或五月。我不希望它由用户完成。
我的心血可以下载到文件:DAX YTD.pbix
我用各种方式追小鹿:
- 通过在 DAX 度量中使用 FILTER 函数。但似乎
FILTER 功能太苛刻了。它首先应用于事实table,
只选择一个月,然后错误地计算 YTD 值。因此,如果
强制计算和过滤顺序会有任何选项,会有
成为希望。
- 我尝试了 SWITCH 函数来显示正确的结果
对于特定月份,其他月份为 0 或 null。虽然我
在这方面取得成功,我无法利用它。当它
来到过滤我和以前一样绝望。顺便说一句,我可以
如果 SWITCH 在 table 末尾生成总计,则可以做到这一点,但它
才不是。出乎意料。
- 我希望 RELATED 函数能够在 [Cut off date] table 中显示正确的结果。到目前为止,我还没有走出迷雾。
非常感谢您的帮助。
赏金前更新。
走向更高的层次。我在 FactTable 中引入了类别列。请下载DAX YTD by category.pbix。所以过滤现在变得更加复杂。我想要苹果类别的正确 YTD 数据。
您是否使用了 Calendar
table 中的 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。
我知道您想按原样显示仪表板,这样用户就不需要每次都 click/input 来查看他们应该看到的内容。这就是为什么我不明白为什么你需要创建一个新的 table 来存储 Cut off date (End of YTD)
。如何自动维护?
上面的 relative date filtering
解决方案实际上仍然适用于您共享的 .pbix 文件。如果将 Date
列从 Calendar
table 拖到黄牌的可视级别过滤器并添加相对日期过滤,它应该如下工作:
对于 End of YTD
视觉对象,您可以使用 following measure 获取上个日历月的第一天,因此您无需为其创建另一个 table:
End of YTD = EOMONTH(TODAY(), -2) + 1
希望这就是您想要实现的目标:
Updated file供大家参考。
再次更新:
我认为您必须编写自己的 YTD
计算而不是使用 built-in 计算,这样您就可以使用您在另一个 [=83] 中定义的截止日期=].在这里,我假设您在 'Cut off date'[End of YTD]
中只有一行。请注意,我已将 ALL()
添加到筛选器中,因此当单击其他 rows/filters 时,黄色卡片保持不变 (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])
)
)
我会通过在您的日历 table 中添加计算列来解决此问题,以将每一行分类为 "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"
)
然后我会将新的 Is YTD 字段添加到 Card visual 的 Visual level filters 中,然后从 Basic 中选择 YTD筛选列表。显示的度量可以是简单的 Total 度量:SUM(FactTable[Value]).
这是一个比任何具体措施体操都要灵活和可重用的解决方案。您不需要大量的措施来在每个基本措施之上应用所需的逻辑——它们都会自然地工作。您可以在任何级别应用过滤器:视觉、页面、报表,或将其放在切片器中以供最终用户控制。
我更喜欢 return 文本结果,例如"YTD" / "Other"(而不是 1/0、True/False 或 Yes/No),因为这可以轻松扩展到其他要求,例如"Prior YTD"(2017 年 1 月 1 日至 2017 年 3 月 1 日)。用在视觉上也更清晰
实际上,我不应该将此设计归功于我 - 这大致遵循了 Cognos Transformer 的相对时间功能在 90 年代的工作方式。
我在 Periodic/YTD 报告中做了类似的事情(最后 sheet):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
)
如何构建 DAX 度量来计算特定月份的 YTD 值之和?
这里我们有按月分组的 FactTable。 FactTable 填充了实际数据和预测数据。了解实际结束时间的唯一方法是 table [截止日期] 列中的 [年初至今结束] 中的信息。在 table [截止日期] 的 [End of YTD] 列中 - 它是一个单一值 table - 我们选择了有趣的月份,我们希望看到 YTD 的计算。在我们的例子中是三月。 FactTable 每月不定期更新,通常会延迟一个月。由于更新不规律,无法将其链接到像TODAY这样的时间函数。
我的心血可以下载到文件:DAX YTD.pbix
我用各种方式追小鹿:
- 通过在 DAX 度量中使用 FILTER 函数。但似乎 FILTER 功能太苛刻了。它首先应用于事实table, 只选择一个月,然后错误地计算 YTD 值。因此,如果 强制计算和过滤顺序会有任何选项,会有 成为希望。
- 我尝试了 SWITCH 函数来显示正确的结果 对于特定月份,其他月份为 0 或 null。虽然我 在这方面取得成功,我无法利用它。当它 来到过滤我和以前一样绝望。顺便说一句,我可以 如果 SWITCH 在 table 末尾生成总计,则可以做到这一点,但它 才不是。出乎意料。
- 我希望 RELATED 函数能够在 [Cut off date] table 中显示正确的结果。到目前为止,我还没有走出迷雾。
非常感谢您的帮助。
赏金前更新。 走向更高的层次。我在 FactTable 中引入了类别列。请下载DAX YTD by category.pbix。所以过滤现在变得更加复杂。我想要苹果类别的正确 YTD 数据。
您是否使用了 Calendar
table 中的 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。
我知道您想按原样显示仪表板,这样用户就不需要每次都 click/input 来查看他们应该看到的内容。这就是为什么我不明白为什么你需要创建一个新的 table 来存储 Cut off date (End of YTD)
。如何自动维护?
上面的 relative date filtering
解决方案实际上仍然适用于您共享的 .pbix 文件。如果将 Date
列从 Calendar
table 拖到黄牌的可视级别过滤器并添加相对日期过滤,它应该如下工作:
对于 End of YTD
视觉对象,您可以使用 following measure 获取上个日历月的第一天,因此您无需为其创建另一个 table:
End of YTD = EOMONTH(TODAY(), -2) + 1
希望这就是您想要实现的目标:
Updated file供大家参考。
再次更新:
我认为您必须编写自己的 YTD
计算而不是使用 built-in 计算,这样您就可以使用您在另一个 [=83] 中定义的截止日期=].在这里,我假设您在 'Cut off date'[End of YTD]
中只有一行。请注意,我已将 ALL()
添加到筛选器中,因此当单击其他 rows/filters 时,黄色卡片保持不变 (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])
)
)
我会通过在您的日历 table 中添加计算列来解决此问题,以将每一行分类为 "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"
)
然后我会将新的 Is YTD 字段添加到 Card visual 的 Visual level filters 中,然后从 Basic 中选择 YTD筛选列表。显示的度量可以是简单的 Total 度量:SUM(FactTable[Value]).
这是一个比任何具体措施体操都要灵活和可重用的解决方案。您不需要大量的措施来在每个基本措施之上应用所需的逻辑——它们都会自然地工作。您可以在任何级别应用过滤器:视觉、页面、报表,或将其放在切片器中以供最终用户控制。
我更喜欢 return 文本结果,例如"YTD" / "Other"(而不是 1/0、True/False 或 Yes/No),因为这可以轻松扩展到其他要求,例如"Prior YTD"(2017 年 1 月 1 日至 2017 年 3 月 1 日)。用在视觉上也更清晰
实际上,我不应该将此设计归功于我 - 这大致遵循了 Cognos Transformer 的相对时间功能在 90 年代的工作方式。
我在 Periodic/YTD 报告中做了类似的事情(最后 sheet):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
)