105_Power Pivot财务科目(层级深度&筛选深度)
博客:www.jiaopengzi.com
1、背景
在财务科目中,需要按照科目层级来显示;在excel中都是用公式来实现,而且对于数据的管理及更新是一件头痛的事情,那么PP来做一个如何呢。
2、必备知识
前提知道PATH相关父子层级的公式及ISFILTERED不知道的去看看官网解释。
传送门:
Parent and Child Functions (DAX)
3、上案例

在pp模型中处理下维度表的层级。

新建列公式如下:
PATH=PATH('科目管理'[科目ID],'科目管理'[父级ID])
一级=LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],1,1))
二级=IF(LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],2,1))=BLANK()
,'科目管理'[一级]
,LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],2,1)))
三级=IF(LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],3,1))=BLANK()
,'科目管理'[二级]
,LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],3,1)))
四级=IF(LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],4,1))=BLANK()
,'科目管理'[三级]
,LOOKUPVALUE('科目管理'[科目名称],[科目ID],PATHITEM('科目管理'[PATH],4,1)))
是否末级=
var s='科目管理'[科目ID]
return
(CALCULATE(COUNTROWS('科目管理'),ALL('科目管理'),'科目管理'[父级ID]=s)=0)*1
PATHLENGTH=PATHLENGTH('科目管理'[PATH])
正常情况下,在事实表,建立total然后拉透视表即可。

科目total:=SUM('科目明细'[value])
模型中建立层级

常态下的透视表

于是,我们发现其中蓝色的部门显示的比较重复了,这样的报表不是很友好。(其中绿色是一种特殊情况,下文讲解)
所以这样写个普通的度量值是不行的,所以我们需要对度量值进行优化。
在这里我们需要引入两个概念:层级深度,筛选深度。
筛选深度
F0:=ISFILTERED('科目管理'[一级])+ISFILTERED('科目管理'[二级])+ISFILTERED('科目管理'[三级])+ISFILTERED('科目管理'[四级])
层级深度
PL:=MAX('科目管理'[PATHLENGTH])
于是我们得到这样一个透视表

通过观察红色区域我们可以发现,这些需要显示的的都是层级深度>=筛选深度,即PL>=F0
优化后公示如下:
VV1:=VAR F0 = ISFILTERED ( '科目管理'[一级] )
+ ISFILTERED ( '科目管理'[二级] )
+ ISFILTERED ( '科目管理'[三级] )
+ ISFILTERED ( '科目管理'[四级] )
VAR PL =MAX ( '科目管理'[PATHLENGTH] )
VAR V0 = '科目明细'[科目total]
RETURN
SWITCH(
TRUE (),
PL >= F0, V0
)

大多数财务科目这样显示就完成了,因为遵循的都是上一级科目=下一级科目总和
拓展
但是绿色的情况,还没有说明,因为有的情况,不遵循上一级科目=下一级科目总和,更多的是出现在业务管理中,如人事层级,上级和下级做同样的事情,需要展现包含自己和下属的明细及总和。
于是末级科目大于0,非末级科目就等于0
MJ:=SUM ( '科目管理'[是否末级] ) = 0

VV2中,第二个条件MJ * V0 > 0 && F0 = PL + 1,适合这种非末级科目,具体情况需要具体分析,这里给出的是一种思路。
VV2:=VAR F0 = ISFILTERED ( '科目管理'[一级] )
+ ISFILTERED ( '科目管理'[二级] )
+ ISFILTERED ( '科目管理'[三级] )
+ ISFILTERED ( '科目管理'[四级] )
VAR PL =MAX ( '科目管理'[PATHLENGTH] )
VAR MJ =SUM ( '科目管理'[是否末级] ) = 0
VAR V0 = '科目明细'[科目total]
RETURN
SWITCH(
TRUE (),
PL >= F0, V0,
MJ * V0 > 0 && F0 = PL + 1, V0
)

4、总结
总结下父子层级主要理解path相关公式,同时对ISFILTERED理解,其中对层级深度及筛选深度需要深入理解,才能对透视表更灵活的展示。
参照圣经Handling parent-child hierarchies章节
另是否末级字段使用的var变量写法,如果是早期版本用earlier
传送门:EARLIER 函数docs.microsoft.com
by焦棚子
105_Power Pivot财务科目(层级深度&筛选深度)的更多相关文章
- Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3
Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3 http://blog.csdn.net/sunbow0 第二章Deep ...
- MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用
索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...
- Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1
Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1 http://blog.csdn.net/sunbow0 Spark ML ...
- Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2
Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2 http://blog.csdn.net/sunbow0 第二章Deep ...
- 条带深度 队列深度 NCQ IOPS
http://blog.csdn.net/striping/article/details/17449653 IOPS 即I/O per second,即每秒进行读写(I/O)操作的次数,多用于数据库 ...
- 深度学习——深度神经网络(DNN)反向传播算法
深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础. 回顾监督学习的一般性问题.假设我们有$m$个训练样本$\{(x_1, y_1), (x_2, y_2), …, ...
- 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记
Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...
- paper 53 :深度学习(转载)
转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...
- 深度树匹配模型(TDM)
深度树匹配模型(TDM) 算法介绍 Tree-based Deep Match(TDM)是由阿里妈妈精准定向广告算法团队自主研发,基于深度学习上的大规模(千万级+)推荐系统算法框架.在大规模推荐系统的 ...
随机推荐
- css两栏布局、圣杯布局、双飞翼布局
最近几个月一直用vue在写手机端的项目,主要写业务逻辑,在js方面投入的时间和精力也比较多.这两天写页面明显感觉css布局方面的知识有不足,所以复习一下布局方法. 两栏布局 1.浮动 .box1 .l ...
- AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)
总结一下AngularJS的核心对象angular上的方法,也帮助自己学习一下平时工作中没怎么用到的方法,看能不能提高开发效率.我当前使用的Angularjs版本是1.5.5也是目前最新的稳定版本,不 ...
- 关于webpack,你想知道的都在这;
咱也标题党一回 哈哈哈 要使用webpack优化项目打包构建速度,首先得知道问题出在哪, 要知道问题出在哪,首先得知道webpack 打包的基本原理才能针对性的去做优化,下面首先了解webpack基本 ...
- vue项目处理dpr和多屏幕适配问题
<!DOCTYPE html> <html style="font-size:37.5px"> <head> <meta charset= ...
- 深入理解nodejs的异步IO与事件模块机制
node为什么要使用异步I/O 异步I/O的技术方案:轮询技术 node的异步I/O nodejs事件环 一.node为什么要使用异步I/O 异步最先诞生于操作系统的底层,在底层系统中,异步通过信号量 ...
- 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习
一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...
- 深入理解Kafka核心设计及原理(二):生产者
转载请注明出处: 2.1Kafka生产者客户端架构 2.2 Kafka 进行消息生产发送代码示例及ProducerRecord对象 kafka进行消息生产发送代码示例: public class Ka ...
- ASP.NET Core WebApi返回结果统一包装实践
前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...
- 【直播回顾】OpenHarmony知识赋能第四期第二课——GPIO驱动开发
3月17日晚上19点,知识赋能第四期直播的第二节课<OpenHarmony标准系统HDF框架之GPIO驱动开发>,在OpenHarmony开发者成长计划社群内成功举办. 本期课程,由 ...
- JS判断移动端还是PC端(改造自腾讯网) 仅用于宣传动画,下载页等
JS判断移动端还是PC端(改造自腾讯网 http://www.qq.com/) 本脚本仅用于宣传动画,下载页( ipad 也算pc端)等, ionic 用 ionic.platform 即可( io ...