博客:www.jiaopengzi.com

焦棚子的文章目录

请点击下载附件

1、背景

在财务科目中,需要按照科目层级来显示;在excel中都是用公式来实现,而且对于数据的管理及更新是一件头痛的事情,那么PP来做一个如何呢。

2、必备知识
前提知道PATH相关父子层级的公式及ISFILTERED不知道的去看看官网解释。

传送门:

Parent and Child Functions (DAX)

ISFILTERED 函数 (DAX)

3、上案例


维度表科目ID与事实表科目ID建立1:n的关系

在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
科目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

关注total和MJ

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
)

结果2重点关注绿色区域

4、总结

总结下父子层级主要理解path相关公式,同时对ISFILTERED理解,其中对层级深度及筛选深度需要深入理解,才能对透视表更灵活的展示。

参照圣经Handling parent-child hierarchies章节

是否末级字段使用的var变量写法,如果是早期版本用earlier

传送门:EARLIER 函数​docs.microsoft.com

by焦棚子

焦棚子的文章目录

105_Power Pivot财务科目(层级深度&筛选深度)的更多相关文章

  1. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.3 http://blog.csdn.net/sunbow0 第二章Deep ...

  2. MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用

    索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...

  3. 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 ...

  4. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.2 http://blog.csdn.net/sunbow0 第二章Deep ...

  5. 条带深度 队列深度 NCQ IOPS

    http://blog.csdn.net/striping/article/details/17449653 IOPS 即I/O per second,即每秒进行读写(I/O)操作的次数,多用于数据库 ...

  6. 深度学习——深度神经网络(DNN)反向传播算法

    深度神经网络(Deep Neural Networks,简称DNN)是深度学习的基础. 回顾监督学习的一般性问题.假设我们有$m$个训练样本$\{(x_1, y_1), (x_2, y_2), …, ...

  7. 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记

    Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...

  8. paper 53 :深度学习(转载)

    转载来源:http://blog.csdn.net/fengbingchun/article/details/50087005 这篇文章主要是为了对深度学习(DeepLearning)有个初步了解,算 ...

  9. 深度树匹配模型(TDM)

    深度树匹配模型(TDM) 算法介绍 Tree-based Deep Match(TDM)是由阿里妈妈精准定向广告算法团队自主研发,基于深度学习上的大规模(千万级+)推荐系统算法框架.在大规模推荐系统的 ...

随机推荐

  1. python学习笔记(五)——静态方法、类方法、运算符重载

    我们都知道类名是不能够直接调用类方法的.在C++中,把成员方法声明为 static 静态方法后可以通过类名调用.同样的在python中也可以通过定义静态方法的方式让类名直接调用. 静态方法 使用 @s ...

  2. CSS5:移动端页面(响应式)

    CSS5:移动端页面(响应式) 如果手机端和PC端页面差别很大,就不要写响应式,不要写@media 就直接将两个页面拆开成两个文件就可以了.关于判断是手机端你还是PC端,就交给后端来做只有一些新闻站点 ...

  3. kbengine开源分布式游戏服务端引擎

    一款开源的支持多人同时在线实时游戏的服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D.OGRE.Cocos2d.HTML5,等等)技术结 ...

  4. 深入理解ES6之《ES7》

    指数运算符 Math.pow是可以进行求幂运算的求幂运算符是两个星号 let result = 5 ** 2 console.log(result) //25 console.log(result = ...

  5. ES6-11学习笔记--函数的参数

    参数的默认值 与解构赋值结合 length属性 作用域 函数的name属性   ES5设置函数参数默认值: function foo(x, y) { y = y || 'world'; console ...

  6. Python:爬取全国各省疫情数据并在地图显示

    代码: import requests import pymysql import json from pyecharts import options as opts from pyecharts. ...

  7. Android回到页面并刷新数据

    通过对Android Activity的生命周期的了解,需要在后退页面重写onResume()的方法. 建立自己更新数据的函数,并在onCreate()方法中调用. @Override protect ...

  8. Python pip下载慢的解决方法

    国外的源下载速度实在是太慢了 可以使用国内的一些镜像网站安装 使用cmd命令 格式:pip install -i 网站 库 例如: 国内的一些镜像网站 清华大学:https://pypi.tuna.t ...

  9. 常⽤的meta标签有哪些

    meta 标签由 name 和 content 属性定义,用来描述网页文档的属性,比如网页的作者,网页描述,关键词等,除了HTTP标准固定了一些name作为大家使用的共识,开发者还可以自定义name. ...

  10. 在UnityUI中绘制线状统计图

    ##先来个效果图 觉得不好看可以自己调整 ##1.绘制数据点 线状图一般由数据点和连线组成 在绘制连线之前,我们先标出数据点 这里我选择用Image图片来绘制数据点 新建Canvas,添加空物体Gra ...