DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)

难度: ★★☆☆☆(2星)

适用范围: ★★☆☆(3星)

应用场景:

其实很多时候对数据汇总都会有层级关系的问题,不过这个模式说的不是产品分类--子分类这样的场景,而说的是父和子都是存到同一个表中(通过一个父节点的字段指定parent),而且父节点和子节点也可能会产生业务数据。

以下是几个应用场景:


销售 - 组织架构层级

  销售员A卖产品,ta的下线a1,a2,a3也销售产品,如何统计ta和ta的下线一个卖了多少产品。

成本 - 产品和产品组件

  产品A有一个组装成本,产品组件a1,a2,a3也分别有它们的组装成本,要对总成本汇总。

盈亏 - 账户和关联子账户
打怪 - 大号与各个小号

欢迎交流与骚扰

Power BI显示如下:

以销售为例:

要点:

1.构建遍历结构
2.判断是否为末节点
3.定义遍历层级
4.当计算当前元组对应的浏览的节点深度

  

注意:由于用中文来命名表/列名并用此来写DAX比较痛苦,试了几次都觉得不太顺手,最后还是用英文了,(⊙o⊙)…

欢迎转载,请保留原文链接和作者信息。O(∩_∩)O谢谢。
DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy) 作者:马丁叔叔
链接:http://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-Parent-Child-Hierarchy.html 

1. 构建遍历机构 - 用PATH语句拿到各个人的上线

[Path] = PATH ( Nodes[Name], Nodes[Parent] )

2. 判断末节点

先来看看那些是末节点:

[IsLeaf] =
CALCULATE (
COUNTROWS ( Nodes ),
ALL ( Nodes ),
Nodes[ParentKey] = EARLIER ( Nodes[NodeKey] )

) = 0

3. 构建遍历层级

看看几层都有谁:

[HierarchyDepth] = PATHLENGTH ( Nodes[HierarchyPath] )

[Level1] =
LOOKUPVALUE (
Nodes[Name],
Nodes[NodeKey],
PATHITEM ( Nodes[HierarchyPath], 1, INTEGER )
) [Level2] =
IF (
Nodes[HierarchyDepth] >= 2,
LOOKUPVALUE (
Nodes[Name],
Nodes[NodeKey],
PATHITEM ( Nodes[HierarchyPath], 2, INTEGER )
),
Nodes[Level1]
) [Level3] =
IF (
Nodes[HierarchyDepth] >= 3,
LOOKUPVALUE (
Nodes[Name],
Nodes[NodeKey],
PATHITEM ( Nodes[HierarchyPath], 3, INTEGER )
),
Nodes[Level2]
)

4.计算当前元组对应的浏览的节点深度,用于计算

BrowseDepth = ISFILTERED ( Nodes[Level1] )
+ ISFILTERED ( Nodes[Level2] )
+ ISFILTERED ( Nodes[Level3] )
 

假如简单的计算,

[Sales Amount Simple] :=
IF (
[BrowseDepth] > [MaxNodeDepth],
BLANK (),
SUM ( Transactions[Amount] )
)

问题:

你会发现:上面有图并没有显示Brad和Annabel各自的值[Sales Amount Simple],但是他们现在汇总的值却比他们对应的子节点的总和要大。

譬如:Brad子节点汇总应该为(Chris400 + Vince500 = 900),但是Brad却为1300。而Brad本身400并没有显示出来。

改进:

[Sales Amount] :=
IF (
[BrowseDepth] > [MaxNodeDepth] + 1,
BLANK (),
IF (
[BrowseDepth] = [MaxNodeDepth] + 1,
IF (
AND (
VALUES ( Nodes[IsLeaf] ) = FALSE,
SUM ( Transactions[Amount] ) <> 0
),
SUM ( Transactions[Amount] ),
BLANK ()
),
SUM ( Transactions[Amount] )
)
)

上面为原文给出的计算,可以看到 左图为pivot table勾选了显示没有数据的显示,右图为不显示没有数值的行。注意这里要显示Subtotal才会显示中间的节点和根节点,如果不勾选的话就会得到下图。

正如下面左边,在PowerBI里面,并没有正确的显示。

再改进:

Sales $ =
IF (
[BrowseDepth] > [MaxNodeDepth] + 1 ,
IF (
AND (
VALUES ( Nodes[IsLeaf] ) = FALSE,
SUM(Transactions[Amount]) <> 0
),
SUM(Transactions[Amount]),
BLANK ()
),
SUM(Transactions[Amount])
)

Excel显示如下:左边为隐藏没有数据的行,右边显示了没有数据的Bill

PowerBI显示如下:

左边是上面改进前的[Sales Amount]的显示,右图是上面[Sales $]的显示。最后一列才是我想要的。

右上的图可以drill-down,如果想玩,可以在这里下载。链接: https://pan.baidu.com/s/1geJe3yN 密码: hfh7

好了,这算是在DAX patterns里面入门级的一个了。

PowerBI戳这里: https://app.powerbi.com/view?r=eyJrIjoiNWM0ZGYwYTMtYTk4Yy00ODE0LTlmNTItZGJmMDkzYTVlOGYyIiwidCI6ImQxYWY4NDdiLTJjZTEtNDRjYi1iYjUwLWQ1ODAyYmI0M2M4YiIsImMiOjEwfQ%3D%3D

参考文章:http://www.daxpatterns.com/parent-child-hierarchies/

欢迎围观和讨论。。。

DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)的更多相关文章

  1. DAX/PowerBI系列 - 参数表(Parameter Table)

    DAX/PowerBI系列 - 参数表(Parameter Table) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★☆(4星) 概况: 这个模式比较简单灵活,而且很实用.所用的DAX语句也比较简 ...

  2. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension)

    跟大家的交流是我的动力. :) DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate Date Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★ ...

  3. DAX/PowerBI系列 - 玩转阿里云 Alicloud Pricing

    DAX/PowerBI系列 - 玩转 阿里云主机 Ali Cloud ECS 难度: ★★☆☆☆(1星) 适用范围: ★★★☆☆(3星) 欢迎交流与骚扰 这是啥: 双十一就到了,码农门,程序猿们有没有 ...

  4. DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数

    DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数 文末有彩蛋,解决蛋疼问题 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 基于时间的汇总可能是 ...

  5. (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比

    盆友们,边看文章边玩,请耐心等待PowerBI load出来~~~~ (7.8秒钟) DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比 难度: ★☆☆☆☆ ...

  6. DAX/PowerBI系列 - 累计总计(Cumulative Total)

    DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 这个模式普 ...

  7. DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板

    DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 当你有多个度量值都需要计算YTD,MoM,而又 ...

  8. DAX/PowerBI系列 - 库存总价值(Inventory Value)

    DAX/PowerBI系列 - 库存总价值(Inventory Value) 欢迎交流与骚扰 难度: ★★☆☆☆(2星) 适用: ★★☆☆☆(2星) 概况: 有多少货(库存)当然重要(对于运营人员), ...

  9. DAX/PowerBI系列 - 参数表(Parameter Table) - 大客户分析(Top N)

    DAX/PowerBI系列 - 参数表(Parameter Table) - 大客户分析(Top N) 难度: ★☆☆☆☆(1星) 适用范围: ★★★☆☆(3星) 概况:此文为DAX/PowerBI系 ...

随机推荐

  1. php将图片以二进制保存到mysql数据库并显示

    一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...

  2. C++风格写判断某年某月某日是一年的第几天

    初学C++,在结构体中写函数及一些C++语言需要的一些格式 看代码 #include<iostream>#include<cstdio>using namespace std; ...

  3. Python中执行系统命令常见的几种方法--转载

    Python中执行系统命令常见的几种方法 Python中执行系统命令常见的几种方法有: (1)os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 # 如果再命令行下执 ...

  4. 排名前10的H5、Js 3D游戏引擎和框架

    由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...

  5. JAVA中StringBuffer类常用方法

    String是不变类,用String修改字符串会新建一个String对象,如果频繁的修改,将会产生很多的String对象,开销很大.因此java提供了一个StringBuffer类,这个类在修改字符串 ...

  6. 利刃 MVVMLight 3:双向数据绑定

          上篇我们已经了解了MVVM的框架结构和运行原理.这里我们来看一下伟大的双向数据绑定. 说到双向绑定,大家比较熟悉的应该就是AngularJS了,几乎所有的AngularJS 系列教程的开篇 ...

  7. ECMAScript 6 笔记(四)

    Symbol 1. 概述 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean) ...

  8. WinForm DataGridView增删改查

    DataGridView连接数据库对表进行增删改查 一.绑定数据源 //做一个变量控制页面刷新 ; public Form1() { InitializeComponent(); } private ...

  9. java实现解析二进制文件(字符串、图片)

    1.需求说明,实现细节要求: 解析二进制文件 files\case10\binary,其中包含一个字符串和一张图片,数据文件格式为字符串数据长度(2字节)+字符串内容+图片数据长度(4字节)+图片数据 ...

  10. C++编程练习(15)----“排序算法 之 归并排序“

    归并排序 归并排序(Merging Sort)的原理: 假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为1,然后两两归并,得到 [n/2] ([ x ] 表示不小于 ...