麦粉社区
>
帖子详情

【上篇】计算列 vs 计算度量:你真的懂吗?

干货分享 发表于 3 天前
发表于 3 天前

在玩转数据模型的过程中,你是不是也被这些小烦恼缠上啦:



  • 计算列到底是个啥?计算度量又是什么神秘 “物种”?

  • 计算列和计算度量之间,到底藏着什么不同的小秘密?

  • 碰到具体问题时,该怎么挑计算列和计算度量呢?


IMG_256


 


首先,计算列、计算度量的存在,主要是辅助我们在创建模型时更好的进行二次计算,那先来说说为啥要二次计算?


打个比方,数据源就像一个食材库,可有时候,里面缺了咱们做菜(分析数据)要用的食材,这时候就得自己动手加工一下,比如把数据 “切一切”(分割)、给字段类型 “换换装”(转换),或者求个平均值、找同期值啥的。


 


注意:这里有个关键的知识点要划重点啦!与报表层面进行二次计算不一样的是,模型定义是全局二次计算,也即我们在数据模型层面定义了一个计算逻辑,它就能在多个报表或多个组件复用。


 


下面就让我们一个个来揭开计算列、计算度量它们背后的神秘面纱吧!



  • 计算列是在V10.5.15的产品新增的,直接将字段添加到原始查询中的字段,成为子查询像数据源表的一部分参与运算。

  • 计算度量则是使用MDX语法定义的度量,基于已有的度量数据展开计算。


两者的含义、作用、创建方式对比详情见下表:


 









































分类



计算列



计算度量



定义



在表中新增列,每行值由自定义公式生成



在多维数据集(OLAP)中通过 MDX 表达式定义,基于已有度量进行二次计算



计算顺序



基于表中现有字段列,逐行计算,先于汇总操作



基于已有的度量值,先汇总数据,再基于汇总结果计算



作用层级



表结构层面,新增列成为表的一部分,作用于数据表内每行数据



度量层面,基于现有度量进一步运算,属于跨维度聚合数据(如按时间、产品类别汇总后计算)



创建入口



数据模型右侧维度区 “+” 号 或 仪表盘报表开发界面的数据维度区 “+” 号



数据模型右侧度量区 “+” 号 或 仪表盘报表开发界面的数据维度区 “+” 号



创建方式



直接进入编辑界面,手动编写表达式(支持字段选择和函数拖拽)



两种方式:


1. 向导式(内置时间计算、数学运算等模板,支持拖拽字段快速创建);
2. 复杂方式(手动编写 MDX 函数,支持函数搜索和示例参考)



支持函数



使用数据库函数或平台内置函数(如数值、文本、日期处理函数)



除了内置函数(含时间计算、聚合函数、逻辑判断等),还支持调用 MDX 的函数,官方文档



 


由于两者创建方式和计算方式略有不同,最终操作步骤和对应得出的结果也会有所差异,详情如下:


 


1、新建计算列,字段皆来自于表字段



  • 入口:在数据模型右侧维度区右上方“+”号或仪表盘报表开发界面的数据维度区右上方“+”号入口都可以新建计算列使用,如图:


 



 



  • 新建计算列:在这个界面中,有表达式编辑框、字段选择栏以及选择函数使用栏,可以根据实际需求,利用这些功能进行相关定义:


 



 



  • 例如我们创建的销售额计算列就是拖拽对应表的字段进行计算即可,如图:


 



 


2、新建计算度量,字段皆来自度量区内的度量字段



  • 入口:在数据模型右侧度量区右上方“+”号或仪表盘报表开发界面的数据维度区右上方“+”号入口都可以新建计算度量使用,如下图:


 



 



  • 新建计算度量:

  • 向导方式(方式一):简单选择进行快速计算 : 实现同期、前期、累计值等,此页签界面主要是提供内置的数学运算、时间计算以及其他计算类型,也即可通过简单的拖拽操作快速创建所需的计算度量,如下图:


 



 



  • 函数方式(方式二)使用mdx函数来实现各种复杂场景下的高级计算,可看到右侧边栏很多内置函数,点击函数可看左下方的说明和示例;



  • 例如我们新建销售额计算度量就可以选择函数方式创建,如图:


 



 


3、创建报表,拖拽计算列和计算度量对比结果:



  • 拖拽销售额计算列展示,可看到是按行输出销售额计算列结果:


 



 



  • 查看系统监控——SQL/MDX监控,涉及的区域和销售额计算列都是从业务数据源通过SQL查询,并且销售额计算列是在原表直接处理,然后和其他表字段一并输出:


 



 



  • 拖拽销售额计算度量展示,可看到销售额计算度量是汇总聚合后的结果:


 



 



  • 查看系统监控——SQL/MDX监控,涉及的区域是从业务数据源通过SQL查询,但是销售额计算度量是在对原表数据分类汇总处理后,再基于汇总结果也即对已有的度量进一步计算处理:


 



 



  • 若把销售额计算列右键复制转度量,再拖拽销售额计算列-对应的度量进行展示,可看到也是根据维度分类聚合计算后输出销售额计算列-度量的结果:


 



 



  • 同样,查看系统监控——SQL/MDX监控,涉及的区域和销售额计算列都从业务数据源通过SQL查询,并且销售额计算列是在原表直接处理,但与维度区普通销售额计算列不同的是,销售额计算列-对应的度量会进行多一层sum的汇总计算,然后再和其他表字段一并输出:


 



 


学习计算列和计算度量两者含义、作用、创建方式和对应结算结果差异后,我们继续来看看两者的应用场景有何区别,常用应用场景对比说明如下表:


 










































































































说明



场景说明



相同之处



(1)均支持数值计算、逻辑判断、日期处理等基础功能;
(2)均可通过自定义公式或函数扩展数据处理能力;
(3)均支持对原始数据进行分类、逻辑判断等。



计算列-
常用场景




  • 转换数据格式、转换数据类型、或取整:



把数值或者日期转换成字符串,使用TOSTR函数;



IMG_256



将时间戳转换成日期格式,使用UNIXTIMETODATE函数;



IMG_257



将字符串类型数据格式转换成日期格式,使用STRTODATE函数;



IMG_258



对字段取整,使用TOINTEGER函数;



IMG_259




  • 求明细数据对应某个日期前X天/年/月/季或日期时间差值等的日期时间计算:



获取当年第一天,可以通过YEAR函数获取当前年,再用CONCAT函数进行拼接;



IMG_260



返回日期之间的天数差,使用DATEDIFF函数;



IMG_261




  • 对原始数据分类判断使用:



对原始数据分类使用IIF函数判断;



IMG_262



对数据表数据的值进行case when判断再应用,可以使用计算列构造出是否



IMG_263



计算度量-
常用场景




  • 对度量做复杂计算,方差、中位数等:



求销售收入的期末值,Tail函数和filter函数结合处理;



IMG_264



求销售额的年方差,使用VAR函数;



IMG_265



查询各个产品类别销售额的中位数,使用Median函数;



IMG_266



查询销售额的4次方根,使用Power函数;



IMG_267




  • 汇总计算:



计算近两个月的销售额,使用AGGREGATE函数和ParallelPerodex函数结合处理;



IMG_268



指定维度进行汇总,使用Fixed函数;



IMG_269



按多个维度进行过滤汇总,aggregate函数和nonemptycrossjoin函数结合处理;



IMG_270




  • 对汇总数据排名、比较、分类处理:



查询各个产品销售额的排名情况,使用rank函数;



IMG_271



计算两个时间段的比值,使用AGGREGATE函数;



IMG_272



对汇总后数据做判断,对度量进行case when判断处理;



IMG_273



 


在本篇文章中,我们系统地梳理了数据模型中计算列与计算度量这两个核心概念的技术内涵和常用场景,不仅清晰界定了计算列与度量值的技术定义,还结合常用应用场景演示了两者的操作和作用差异,对比了两者在操作入口、作用范围、计算逻辑等方面的特性,相信我们对计算列和计算度量都有了一定的了解!


 


那么新问题来了,当遇到不同业务场景需求我们如何快速选用计算列还是计算度量,确保业务展示结果正确性呢?


诚邀您继续关注【下篇】计算列 vs 计算度量:你真的懂吗?——如何选用计算列或计算度量吧~


 


【有奖互动】亲爱的数据达人们,我们诚挚邀请您分享对于选用计算列还是计算度量的示例,精彩回复将获得惊喜麦豆奖励!让我们一起来探讨这个数据分析中的经典话题吧!


 

发表于 前天 11:29
所以明细行上的运算就用计算列,需要汇总后的运算就用计算度量,是这样的吗
回复

使用道具 举报

发表于 前天 11:29
收藏
回复

使用道具 举报

发表于 前天 14:04


所以计算列就像源表里的字段一样,可以在这里预览看到。

回复

使用道具 举报

发表于 前天 14:05
但是我用iif函数,判断维度的话,好像就必须要拖对应维度才会显示正常了,但是我只是想获取出来某个维度数据那个数值是多大。这是得用计算列?
  •   我想退休~
    你这种是单纯要展示那个类别下的汇总数据吧,可以试试用计算列,然后用case when这样子判断维度数据,满足要求就是原始值,不满足0,再汇总?
    前天 15:00| 回复

回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

5回帖数 0关注人数 139浏览人数
最后回复于:2025-4-10 10:18
快速回复 返回顶部 返回列表