https://zhuanlan.zhihu.com/p/68183990

我在知识星球收到的问题中,关于表格和矩阵(以下统称表格)总计行错误算是常见的问题之一了,不少初学者甚为不解,在Excel透视表中很常见的总计,为什么到了更强大的 PowerBI 中,反而会出现这么低级的错误呢?

并且碰到这个错误,很多人都束手无策,不知道该怎么办,或者干脆设置为不显示总计行了,其实没有必要,本文就来介绍一下为什么会出现错误,以及解决的办法。

总计的计算逻辑

在PowerBI的表格中,每一个数据都是根据当前的上下文计算出来的,包括总计,也就是说,总计是按照总计行的上下文独立计算的,而不是根据上面的明细相加得来的。

为了理解上面这段话的含义,请看下面的例子。

假设要计算每个产品的订单数量,根据订单表中的数据,新建个度量值,

系统订单数量 = COUNTROWS('订单')

在矩阵中显示如下:

计算逻辑比较简单时,默认情况下总计行的数据是没问题的。

假设每种产品的订单中,都有两个是测试订单,也就是真实订单比系统中的订单数要少两个,那么真实订单的度量值如下:

实际订单数量 = COUNTROWS('订单')-2

把这个度量值放进来,看看是什么结果,

可以看到每一个产品的实际订单数量都少了两个,计算是正确的,但总计行竟然也只少了两个,明显与明细数据之和不符!

这就是总计的计算逻辑,它不管上面的明细数据是多少,它只是在汇总的订单数量的基础上减去2,于是得到了4624。

理解了这个计算逻辑,下面就来看看如何解决。


总计错误的解决方案

既然我们想让总计等于上面明细之和,那么我们就按照这个逻辑构建一个度量值,

------------------

实际订单数量1 =

IF(

HASONEVALUE('产品'[产品名称]),

[实际订单数量],

SUMX(

VALUES('产品'[产品名称]),

[实际订单数量]

)

)

-----------------

这个度量值的先利用IF函数做个判断,如果当前上下文是产品名称,就计算 [实际订单数量],否则,就利用SUMX对所有的产品名称的 [实际订单数量]求和。

看一下计算结果,

总计行得到了正确的结果。

实际上这个度量值的写法还可以继续简化,连IF判断都省略掉,直接用SUMX.

---------------

实际订单数量2 =

SUMX(

VALUES('产品'[产品名称]),

[实际订单数量]

)

---------------

同样得到了正确的结果。

这就是SUMX的强大之处,在明细行,利用VALUES函数获取当前的上下文,计算当前上下文的订单数量,在总计行,自动对筛选出的所有的产品名称的数据进行汇总。

[实际订单数量2]的写法,就是终极解决方案。

总结

为了使总计行计算出正确的结果,终极解决方案只需两步:

1、先正常写一个度量值,保证明细行正确;

2、在第1步度量值的基础上,套一层SUMX函数,即可保证明细行和总结行均正确。

然后使用第二步的度量值作为表格的值就可以了。

(如果熟练,你也可以一步写出最终的度量值)

记住这个终极方案DAX:

SUMX(
VALUES(明细行字段),
[明细行正确的度量值]
)

下次再遇到类似问题,你可以直接套用。

练习PowerBI时若没有数据,可以在公众号回复关键字"数据"获取我整理的近百个精选数据集。

如果文章对你有帮助,看完别忘了点个赞哦。

数据可视化之DAX篇(十七)Power BI表格总计行错误的终极解决方案的更多相关文章

  1. 数据可视化之DAX篇(二十七)半累加度量,在Power BI 中轻松处理

    https://zhuanlan.zhihu.com/p/96823622 ​开始半累加的计算之前,我们先看看什么是累加.半累加以及不可累加数据. 在含有大量行的数据表中,各种数据处理语言,包括DAX ...

  2. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  3. 数据可视化之DAX篇(十一)Power BI度量值不能作为坐标轴?这个解决思路送给你

    https://zhuanlan.zhihu.com/p/79522456 对于PowerBI使用者而言,经常碰到的一个问题是,想把度量值放到坐标轴上,却发现无法实现.尤其是初学者,更是习惯性的想这么 ...

  4. 数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

    https://zhuanlan.zhihu.com/p/109964336 ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...

  5. 数据可视化之DAX篇(二十八)Power BI时间序列分析用到的度量值,一次全给你

    https://zhuanlan.zhihu.com/p/88528732 在各种经营分析报告中,我们常常会看到YTD,YOY这样的统计指标,这样的数据计算并不难,尤其是在PowerBI中,因为有时间 ...

  6. 数据可视化之DAX篇(二十四)Power BI应用技巧:在总计行实现条件格式

    https://zhuanlan.zhihu.com/p/98975646 如何将表格或者矩阵中值的条件格式也应用于总计行? 目前PowerBI并不支持这种功能,无法在总计行或者小计行上应用条件格式, ...

  7. 数据可视化之DAX篇(二十一)连接表的几个DAX函数,一次全掌握

    https://zhuanlan.zhihu.com/p/67015995 编写DAX代码进行业务分析时,经常会用到表与表之间的连接计算,比如在之前的产品关联分析一文中(如何用Power BI分析产品 ...

  8. 数据可视化之DAX篇(五) 使用PowerBI的这两个函数,灵活计算各种占比

    https://zhuanlan.zhihu.com/p/57861350 计算个体占总体的比例是一个很常见的分析方式,它很简单,就是两个数字相除,但是当需要计算的维度.总体的范围发生动态变化时,如何 ...

  9. 数据可视化之DAX篇(十五)Power BI按表筛选的思路

    https://zhuanlan.zhihu.com/p/121773967 ​数据分析就是筛选.分组.聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特 ...

随机推荐

  1. SpringBoot任务

    异步任务: 在方法上添加@Async注解 表明这个方法是一个异步的方法 package com.king.service; import org.springframework.scheduling. ...

  2. Node.js 学习笔记(一)

    node.js说白了就是JavaScript. node.js的性能是php的86倍(大概). 在下载完后可以用命令行打开及运行.   什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留 ...

  3. JS之预解释原理

    预解释的原理 预解释的不同机制 var的预解释机制 function 的预解释机制 预解释机制 面试题练习 预解释的的不同机制 预解释也叫预声明,是提前解释声明的意思:预解释是针对变量和函数来说的:但 ...

  4. (七)logback 异步输出日志

    <!-- 异步输出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.Asyn ...

  5. UI 自动化环境搭建

    1,pip install selenium 2,驱动放在放在 Python 的根目录下

  6. 这一次搞懂Spring代理创建及AOP链式调用过程

    文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...

  7. Java 多线程基础(九)join() 方法

    Java 多线程基础(九)join 方法 一.join() 方法介绍 join() 定义 Thread 类中的,作用是:把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.如:线 ...

  8. opencv C++图像读取

    int main(){ cv::Mat img=cv::imread("/home/nan/图片/highdeepth/starry.jpg",cv::IMREAD_REDUCED ...

  9. [ C++ ] set_new_handler解析

    当 operator new 中malloc返回值为0(NULL)时,表示分配内存失败(可能是因为内存不足), 此时会通过_callnewh()调用用户通过set_new_handler()设定的ne ...

  10. Python实用笔记 (3)条件判断

    可以执行多条语句,靠的是缩进原则,看起来也更板扎(注意冒号) age = 3 if age >= 18: print('adult') elif age >= 6: print('teen ...