问题描述
问题:
计算在切片器中选择的期间的上一年期间的总数。表有金额、期间和日期,即 11/1/2020 期间 11/2020,基于期间。
尝试:
选择的切片器周期为 10/2020 和 11/2020。 表格视觉对象包含期间和金额列。数据模型表包含列、帐户、金额、期间和期间日期。每个期间的多个帐户将具有相同的期间日期,以对期间进行排序。例如,帐户 1 到 3 都将 11/1/2020 作为期间 11/2020 的期间日期。为计算去年金额而创建的计算度量如下:
去年期间总计 = 计算( Sum(‘表’[金额]) , 筛选( '桌子',SAMEPERIODLASTYEAR(‘表’[期间日期]) ) )
结果:
已计算的度量已添加到表中,但仅显示切片器中所选期间的金额,而不是同期但上一年的期间。 因此 10/2020 的金额将为 2000 美元,计算结果应显示 10/2019 的金额,即 1500 美元。
时期 |金额 |去年期间总计
11/2020 2000 美元 2000 美元
10/202。 1500 美元 1500 美元
预期结果:
时期 |金额 |去年期间总计
11/2020 2000 美元 1500 美元
10/2020 1500 美元 1000 美元
解决方法
要像sameperiodlastyear一样使用时间智能,您必须使用日期表(标记为日期表)。阅读此说明:
https://dax.guide/sameperiodlastyear/#
为了使用任何时间智能计算,您需要一个格式良好的日期表。日期表必须满足以下要求:
所需年份的所有日期都必须存在。日期表必须始终从 1 月 1 日开始到 12 月 31 日结束,包括此范围内的所有天数。如果报告仅引用会计年度,则日期表必须包括从会计年度的第一天到最后一天的所有日期。例如,如果 2008 财政年度从 2007 年 7 月 1 日开始,则日期表必须包括从 2007 年 7 月 1 日到 2008 年 6 月 30 日的所有天数。 需要有一个包含唯一值的 DateTime 或 Date 数据类型的列。此列通常称为日期。尽管 Date 列经常用于定义与其他表的关系,但这不是必需的。尽管如此,日期列必须包含唯一值,并且应该被标记为日期表功能引用。如果该列还包含时间部分,则不应使用时间 - 例如,时间应始终为上午 12:00。 日期表必须在模型中标记为日期表,以防日期表和任何其他表之间的关系不基于日期。 评论 日期参数可以是以下任何一种:
对日期/时间列的引用。仅在这种情况下,上下文转换才适用,因为列引用被替换为 可计算的(不同的 ( ) ) 返回单列日期/时间值的表表达式。 定义日期/时间值的单列表的布尔表达式。 结果表仅包含日期列中存在的日期。
内部 SAMEPERIODLASTYEAR 对应于 DATEADD 的以下调用:
DATEADD ( <Dates>,-1,YEAR )
,
要使用时间智能函数,应使用格式良好的日期表。可以使用各种技术创建一个;一个简单的可以在这里找到
DAX 101: Creating a simple date table in DAX
也就是说,您的代码中的错误是您在当前过滤器上下文中迭代了 Table 部分。您可能会看到更好的结果(但可能仍然不正确,因为缺少 Date 表,使用 ALL( 'Table' )
而不是仅 'Table'
。这样您将过滤整个表,而不仅仅是中的部分当前时期。
Total For Period Last Year =
CALCULATE(
SUM( 'Table'[Amount] ),FILTER( ALL( 'Table' ),SAMEPERIODLASTYEAR( 'Table'[Period Date] ) )
)
我不确定,因为我从不使用自动日期/时间,但这也可以通过在启用自动日期/时间时使用 Power BI 生成的日期表来工作(如果我正确记住了有关如何使用的语法)它)
Total For Period Last Year =
CALCULATE(
SUM( 'Table'[Amount] ),SAMEPERIODLASTYEAR( 'Table'[Period Date].[Date] ) )
)