加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
当一个表的列不能满足分析使用,需要新的列用于报告的切片器、行或列、坐标轴、度量值的FILTER等,就要考虑新建列。
新建列方法
新建列的可以在4个环节内完成:数据源、PowerQuery、VAR过程列、DAX计算列。
数据源:在上游数据源(数据库或文件)中新建列,然后直接导入PowerBI使用。
PowerQuery:在数据清洗的过程中添加列,处理后加载到模型。
VAR过程列:不生成物理列,在计算列的计算过程中,使用VAR现调取现使用,用后抛弃。
在金额计算列中使用了VAR价格列:
金额 =
VAR _vm_Price = RELATED(Dim_Product[Price])
RETURN [数量]*_vm_Price
DAX计算列:在现有的表中使用DAX新建列。
特别说明一下,DAX计算列,这种方法使用DAX语言、基于模型关系,相对简单快捷,使用频率很高,但也有一定的劣势,尤其是一个表有上百万行的情况,在PowerBI服务器上会占用计算内存影响报告性能,而且压缩率不佳影响模型的大小。一个几百M的模型,已经很大了,在模型中一个1000万行的表中使用RELATED新建一列生成的文件,比在PowerQuery中合并查询生成的文件大30M左右。
优先级建议
那优先使用哪种方法新建列呢?
1 充分利用模型,因为有关系的存在,能不新建列就不要新建列。维度表中的列可以直接用于报告,没必要使用RELATED新建计算列。
2 在计算列或度量值中使用过程列。比如订单表中的金额列=单价*数量,单价来自于另外的价格表(有无关系不重要),没有必要为了计算金额列在订单表中新建一个单价列,VAR获取到当前行对应的另外一个表的价格就可以了。甚至可以在书写度量值的过程中,在VAR表中使用ADDCOLUMNS新建列,然后基于这个VAR表计算度量值。
3 如果必须新建物理列(数据表中存在的列),能在数据源中新建列,就优先在数据源中新建列。
4 数据源不方便调整的话,能在PowerQuery中添加列,就在PowerQuery中添加列。注意,在使用增量刷新的表中,该方法不适用,因为它仅更新增量刷新的行,反而是DAX计算列会在增量刷新后更新所有的行。
5 以上皆不可,使用DAX新建列。