Power BI统计2020年已开收据数的度量值返回空白如何解决
Power BI DAX统计2020年收据总量问题排查与修正
问题现象
- 需求:创建Power BI度量值统计2020年已开具收据的总数量,预期返回正确结果440000
- 第一版DAX表达式始终返回空白,将其改为计算列后问题依旧存在,代码如下:
CALCULATE(SUM(Receipts[issued]), FILTER(Receipts, Receipts[Year] = 2020))
- 调整后的第二版DAX表达式直接返回Year相关语法错误,无法正常运行,代码如下:
CALCULATE(SUM(Receipts[issued]), FILTER(Receipts, Receipts[Year].Year = 2020))
- 环境前提:Receipts表中
Year列的数据类型为日期类型,该表已通过日期字段与dimDate日期维度表建立模型关联。
问题根因
- 第一版表达式返回空白:
Receipts[Year]是日期类型,存储的是具体日期值(如2020/1/1、2020/12/31),直接和整数2020做相等判断永远无法匹配到行,因此聚合结果为空。 - 第二版表达式报语法错误:DAX不支持类似面向对象语言的
.Year属性写法直接取日期年份,必须通过DAX内置时间函数提取日期分量。 - 写法不规范:已建立与日期维度表的模型关系时,直接在事实表上添加全表筛选属于低效写法,可能受关系筛选方向影响出现统计偏差,优先利用维度表做筛选更符合星型建模规范。
修正方案
按照性能和规范性从优到劣,可选择以下任意一种写法:
- 基于日期维度表筛选(推荐,性能最优)
该写法利用已建立的模型关系自动传递筛选,不需要逐行扫描事实表:2020年已开收据总量 = CALCULATE( SUM(Receipts[issued]), dimDate[Year] = 2020 )注意:需确保dimDate维度表中存在整数类型的
Year列,直接存储2020、2021这类四位年份值,这也是标准日期维度表的必备字段。 - 基于事实表日期列用YEAR函数筛选
如果不使用日期维度表,可通过DAX内置YEAR()函数提取日期的年份值做匹配:2020年已开收据总量 = CALCULATE( SUM(Receipts[issued]), FILTER( Receipts, YEAR(Receipts[Year]) = 2020 ) ) - 简化筛选写法
简单等值筛选场景下可省略FILTER函数,直接将筛选条件传入CALCULATE,引擎会自动做查询优化:2020年已开收据总量 = CALCULATE( SUM(Receipts[issued]), YEAR(Receipts[Year]) = 2020 )
内容的提问来源于stack exchange,提问作者Sweepster
相关产品推荐
相关产品推荐

