如何用DAX在折线图时间轴创建线性投影线(含计算表方案)
生成线性投影数据的解决方案(计算表+日历表方案)
1. 先搞定通用日历表
首先需要一个覆盖所有项目时间范围的日历表,用DAX直接生成(以Power BI为例,Excel可通过序列功能生成后加载):
通用日历 = ADDCOLUMNS ( CALENDAR ( MIN('项目表'[开始日期]), MAX('项目表'[结束日期]) ), "年份", YEAR([Date]), "月份", MONTH([Date]), "日", DAY([Date]) )
这个表会自动包含所有项目的最早开始日到最晚结束日的所有日期,后续用来匹配每日数据。
2. 创建项目每日投影计算表
用DAX生成关联项目、日期和每日/累计目标的计算表,实现线性拆分:
项目每日投影表 = GENERATE ( '项目表', VAR 项目总天数 = DATEDIFF('项目表'[开始日期], '项目表'[结束日期], DAY) + 1 VAR 项目日期区间 = CALENDAR('项目表'[开始日期], '项目表'[结束日期]) RETURN ADDCOLUMNS ( 项目日期区间, "每日目标值", '项目表'[目标值] / 项目总天数, "累计投影目标", VAR 当前日期 = [Date] VAR 已度过天数 = DATEDIFF('项目表'[开始日期], 当前日期, DAY) + 1 RETURN 已度过天数 * ('项目表'[目标值] / 项目总天数) ) )
关键逻辑说明:
GENERATE:把每个项目和它的完整日期区间做匹配,生成逐行的日期-项目对应关系项目总天数:含首尾当天的总周期天数,避免拆分目标时少算一天累计投影目标:用来绘制线性投影线的核心值,计算到当前日期的累计应完成目标
3. 建立表间关系
在模型视图中:
- 连接
通用日历[Date]和项目每日投影表[Date](一对一关系) - 连接
项目表[项目]和项目每日投影表[项目](一对一关系)
确保关系正常激活,不然可视化会出问题。
4. 绘制线性投影线
用折线图可视化:
- X轴:选
通用日历[Date] - Y轴:选
项目每日投影表[累计投影目标] - 图例:选
项目每日投影表[项目]
就能得到每个项目的线性进度投影线。
更优替代方案(无额外计算表)
如果不想新增计算表,可以直接用度量值实现,更轻量化:
累计投影目标 = VAR 当前选中日期 = MAX('通用日历'[Date]) VAR 当前项目 = SELECTEDVALUE('项目表'[项目]) VAR 项目启始日 = CALCULATE(MAX('项目表'[开始日期]), '项目表'[项目] = 当前项目) VAR 项目截止日 = CALCULATE(MAX('项目表'[结束日期]), '项目表'[项目] = 当前项目) VAR 总周期天数 = DATEDIFF(项目启始日, 项目截止日, DAY) + 1 VAR 已过天数 = DATEDIFF(项目启始日, 当前选中日期, DAY) + 1 VAR 单日目标 = CALCULATE(MAX('项目表'[目标值]), '项目表'[项目] = 当前项目) / 总周期天数 RETURN IF(当前选中日期 BETWEEN 项目启始日 AND 项目截止日, 已过天数 * 单日目标, BLANK())
直接把这个度量值拖到折线图Y轴,X轴用日历日期,就能生成投影线,减少表数量,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Pawel Osipowski
相关产品推荐
相关产品推荐

