问题
如何创建和显示“年初至今YTD”和“月初至今MTD”计算。
答案
1、最简单的YTD:
假设订单日期都是早于TODAY的,那么YTD可以如下实现:
YTD=
DATEDIFF(“year”,[订单日期], TODAY()) = 0
// 结果是 TRUE/FALSE的判断
当然,年度相等也可以使用YEAR函数,YEAR([订单日期]) = YEAR( TODAY() ),不过考虑到后期切换QTD/MTD,建议统一用DATEDIFF来写。
注意,这个YTD是结果为TRUE/FALSE的判断,如果要计算YTD sales,那么可以如下实现:
YTD_sales=
SUM( IIF( YTD, [sales],null))
当然,由于这个逻辑比较简单,我个人建议直接合并在一起完成,如下:
YTD_sales=
SUM( IIF( DATEDIFF(“year”,[订单日期], TODAY()) =0 , [sales],null))
这就是使用最多的YTD的方法,YTD部分只需要一次DATEDIFF计算即可完成。
2、增加条件的YTD
如果TODAY当日改为参数日期,或者对应的日期存在晚于TODAY的数据明细,那么就要增加一个判断:
YTD逻辑如下:
YTD=
DATEDIFF(“year”,[订单日期], parameter_date ) =0
AND [订单日期]<= parameter_date
// 结果是 TRUE/FALSE的判断
YTD销售额的逻辑如下,为了方便理解,这里把IIF改为IF- THEN- END:
YTD_sales= SUM(
IF DATEDIFF(“year”,[订单日期], parameter_date ) =0
AND [订单日期]<= parameter_date
THEN [sales] ENB)
对比:官方提供了如下的YTD选项,在我看来,计算逻辑略微复杂,更多的计算意味着更低的性能。
选项 1 (MTD)创建年初至今和月初至今计算 | Tableau Software选项 2 (MTD)
- 选择“分析”>“创建计算字段”
- 将字段命名为“YTD Sales”(YTD 销售额),输入以下计算,然后单击“确定”:
[Order Date] <= TODAY() AND
DATETRUNC( "year", [Order Date]) = DATETRUNC("year", TODAY() )
- 将“YTD”拖到筛选器功能区上,并选择“True”
选项 2 (MTD)
- 选择“分析”>“创建计算字段”
- 将字段命名为“MTD Sales”(MTD 销售额),输入以下计算,然后单击“确定”: [Order Date] <= TODAY() AND DATETRUNC( “month”, [Order Date]) = DATETRUNC(“month”, TODAY() )
- 将“MTD”拖到筛选器功能区上,并选择“True”
3、去年同期YTD
去年同期YTD需要满足两个条件,日期和today的年度间隔是1年,同时早于today对应的去年同期日。
去年同期YTD=
DATEDIFF(“year”,[订单日期], TODAY()) =1
AND [订单日期], TODAY()-365
注意,这里的结果依然是TRU E/FALSE,另外,datediff计算间隔,去年在today之前,间隔一年;today的去年同期,不需要DATEADD函数,直接 TODAY()-365 即可。
考虑到闰年是四年一见的极端情况,不需要考虑366天的特殊值。
4、去年同期MTD
去年同期MTD和YTD类似,同期月份间隔12个月,如下:
去年同期MTD=
DATEDIFF(“month”,[订单日期], TODAY()) =12
AND [订单日期], TODAY()-365
这样的逻辑,是我目前想到的极简语法。如果有更好的方案,欢迎留言。
@喜乐君
Jan 31, 2023