基于公司专属日历的DAX YTD同期上年及MTD计算求助
基于公司自定义日历的DAX YTD/MTD计算方案
首先确认核心前提:你的「Date Invoice」维度表需要包含公司自定义的会计周期字段(如果没有,需先通过DAX或ETL生成),比如:
公司会计年:标记每个日期所属的公司会计年度(可能非自然年)公司会计月序号:数字格式(如202406),唯一标识公司定义的会计月,方便排序和跨年度比较公司会计月起始日期/公司会计月结束日期:每个公司会计月的起止范围公司会计年度起始日期:公司会计年的起始日
以下是具体DAX计算逻辑:
1. 公司会计月MTD(月初至今)
公司MTD销售额 = VAR 当前会计月 = SELECTEDVALUE('Date Invoice'[公司会计月序号]) VAR 当前最大发票日 = MAX('Sales Order and Invoice'[Invoice Date]) RETURN CALCULATE( SUM('Sales Order and Invoice'[销售额]), FILTER( ALL('Date Invoice'), 'Date Invoice'[公司会计月序号] = 当前会计月 && 'Date Invoice'[日期] <= 当前最大发票日 ) )
逻辑说明:锁定当前筛选的公司会计月,筛选该会计月内所有早于/等于当前最大发票日期的记录,求和销售额。若需支持会计月切片器多选,可将SELECTEDVALUE替换为MAX或结合ALLSELECTED调整。
2. 公司会计年YTD(年初至今)
公司YTD销售额 = VAR 当前会计年 = SELECTEDVALUE('Date Invoice'[公司会计年]) VAR 当前最大发票日 = MAX('Sales Order and Invoice'[Invoice Date]) RETURN CALCULATE( SUM('Sales Order and Invoice'[销售额]), FILTER( ALL('Date Invoice'), 'Date Invoice'[公司会计年] = 当前会计年 && 'Date Invoice'[日期] <= 当前最大发票日 ) )
逻辑说明:锁定当前公司会计年,筛选该年度内所有早于/等于当前最大发票日期的记录求和,适配非自然年的会计周期规则。
3. 公司会计年上年同期YTD
公司上年同期YTD销售额 = VAR 当前会计年 = SELECTEDVALUE('Date Invoice'[公司会计年]) VAR 上年会计年 = 当前会计年 - 1 VAR 当前会计月序号 = SELECTEDVALUE('Date Invoice'[公司会计月序号]) VAR 上年对应会计月序号 = 当前会计月序号 - 100 // 如202406 → 202306 VAR 上年对应截止日 = CALCULATE( MAX('Date Invoice'[日期]), FILTER( ALL('Date Invoice'), 'Date Invoice'[公司会计年] = 上年会计年 && 'Date Invoice'[公司会计月序号] = 上年对应会计月序号 && 'Date Invoice'[日期] <= DATE(YEAR(MAX('Sales Order and Invoice'[Invoice Date])), MONTH(MAX('Sales Order and Invoice'[Invoice Date])), DAY(MAX('Sales Order and Invoice'[Invoice Date]))) ) ) RETURN CALCULATE( SUM('Sales Order and Invoice'[销售额]), FILTER( ALL('Date Invoice'), 'Date Invoice'[公司会计年] = 上年会计年 && 'Date Invoice'[日期] <= 上年对应截止日 ) )
逻辑说明:先匹配上年会计年及对应会计月,再找到上年同期对应当前发票日期的截止点,最后筛选上年会计年中早于该截止点的记录求和,完全贴合公司自定义的日期归属规则。
关键补充
- 确保「Sales Order and Invoice」与「Date Invoice」通过原始发票日期建立一对一/一对多关系,让事实表能正确关联到维度表的公司会计字段。
- 若维度表缺少自定义会计字段,可通过DAX规则生成(示例):
公司会计月序号 = SWITCH( TRUE(), // 示例:7月1-2日归属6月 'Date Invoice'[日期] >= DATE(2024,7,1) && 'Date Invoice'[日期] <= DATE(2024,7,2), 202406, // 示例:7月31日归属8月 'Date Invoice'[日期] = DATE(2024,7,31), 202408, // 其他特殊规则... // 默认规则:自然年月 YEAR('Date Invoice'[日期])*100 + MONTH('Date Invoice'[日期]) )
建议优先在ETL阶段处理这些日期归属规则,减少DAX计算负担。
内容的提问来源于stack exchange,提问作者ofeliajesus
相关产品推荐
相关产品推荐

