计算累计有两类常用的时间智能函数,以 DATESYTD 为代表的返回日期值的表函数和以 TOTALYTD 为代表的返回标量值的函数。
DATESYTD
DATESYTD ( <Dates>, [<YearEndDate>] )
在当前上下文环境中,返回一张单列的日期表,其中包含当前年份到目前为止的所有日期。
参数 | 属性 | 描述 |
---|---|---|
Dates | 日期格式的列或返回单列的表达式,通常使用日期表的日期列 | |
YearEndDate | 可选 | 年截止日,日期字符串,忽略年 |
------------- 从 1 月 1 日开始计算的年累计销售额(默认) --------------- Example1 = CALCULATE(SUM(Sales[SalesAmount]), DATESYTD(DateTime[DateKey])) ------------- 从 7 月 1 日开始计算的年累计销售额 --------------- Example2 = CALCULATE(SUM(Sales[SalesAmount]), DATESYTD(DateTime[DateKey],"6/30"))
从语义上,DATESYTD 等价于下面的表达式:
DATESBETWEEN ( <Dates>, STARTOFYEAR ( LASTDATE ( <Dates> ), [<YearEndDate>] ), LASTDATE ( <Dates> ) )
- 季度累计:DATESQTD
- 月累计:DATESMTD
TOTALYTD
TOTALYTD ( <Expression>, <Dates>, [ <Filter>], [ <YearEndDate>] )
计算当前计值上下文中表达式的年初至今值,TOTALYTD 返回标量结果,是 CALCULATE+DATESYTD 的简化形式,语义更直观。
参数 | 属性 | 描述 |
---|---|---|
Expression | 需要计值的表达式 | |
Dates | 日期格式的列或由单个日期列构成的表,通常使用日期表的日期列 | |
Filter | 可选 | 布尔表达式或定义了筛选器的表表达式 |
YearEndDate | 可选 | 年截止日 |
------------- 从 1 月 1 日开始计算的年累计销售额(默认) --------------- Example1 = TOTALYTD(SUM(Sales[SalesAmount]), DateTime[DateKey]) ------------- 从 7 月 1 日开始计算的年累计销售额 --------------- Example2 = TOTALYTD(SUM(Sales[SalesAmount]), DateTime[DateKey],"6/30") ------------- 从 7 月 1 日开始计算的年累计销售额,忽略来自日期表的其他筛选器 --------------- Example3 = TOTALYTD(SUM(Sales[SalesAmount]), DateTime[DateKey],ALL(DateTime),"6/30")
从语义上,TOTALYTD 等价于下面的表达式:
CALCULATE ( <Expression>, DATESYTD ( <Dates>, [<YearEndDate>] ), [<Filter>] )
与 TOTALYTD 类似的时间智能函数还有
- 季度累计:TOTALQTD
- 月累计:TOTALMTD
使用基础函数重写 DATESYTD
你已经学习了计算月累计、季度累计和年累计的 DAX 函数,如果使用 TOTALYTD、TOTALQTD 或 TOTALMTD 这些标量函数,它们的实现方式是通过调用 DATESYTD、DATESQTD 和 DATESMTD 来确定日期筛选器,而每个筛选器函数都可以通过在 DAX 中编写 FILTER 语句实现类似的结果。
这种编写方式虽然并不常用,但对于理解时间智能函数的本质非常重要。而且,当你使用 DirectQuery 模式时,时间智能函数是不可用的,你必须使用基础函数来实现时间智能的计算逻辑。
例如,考虑下面这个 DATESYTD 函数
DATESYTD ( 'Date'[Date] )
它相当于在日期列上使用由 CALCULATETABLE 调用的 FILTER 筛选器,如以下代码所示:
高老师,我测试DATESYTD函数,怎么显示的是明年的1月1日到12月31日啊
指定了天和月份的 DATESYTD 对应的 FILTER 版本写法只考虑了月份,没有考虑天。
我觉得同一个月份时,还需要 DAY ( MAX ( ‘Date'[Date] ) ) <= 天
————- 从 7 月 1 日开始计算的年累计销售额 —————
Example2 = CALCULATE(SUM(Sales[SalesAmount]), DATESYTD(DateTime[DateKey],”6/30″))
上面应该是从1月1日开始计算到6月30日的年累计销售额吧
有处笔误 月累计:TOTALYTD