PBI之模拟ABC 分析矩阵的建模(二)

一、构建图表原则

1、任何图表都需要有时间维度,否则图表无意义(此案例没有设置时间维度,佐罗老师失误了。)

2、图表两个要素:1、元素(非运算字段、列、度量值);2、度量值;如果没有,就用DAX生成;

3、为制作图表,会用DAX生成新表,生成新表(table)不与 base table 建立联系,而是通过 TREATAS 函数建立联系,原因:不让新表污染原数据模型。

二、需要解决的问题清单

1、X轴为变量,变量分别为省份、行业、职业和产品四类,它们分属于不同的维度表,如何将这四类维元素整合到一起?  (佐罗老师:构建ABC 元素表 )

对于没有的表、列、度量值,有且只有一条路可以走,用DAX做出来

问题一:如何将省份、行业、职业和产品四类元素整合到一起?

答案: 把四个元素从不同的表中提出来,合成一张表。

问题二:如何提出来和合成新表? 

需要用到4个函数: ADDCOLUMNS 、SELECTCOLUMNS、DISTINCT和 UNION 四个函数。

以下是这4个函数的功能:

1、DISTINCT(ColumnNameorTableExpr) 针对一个列参数,返回由一列组成的一个表,列中包含不同(唯一)值。或针对一个表表达式参数,返回包含不同(唯一)值组合的多个列。

      参数  ColumnNameorTableExpr     列名或表的表达式                             参数性质:必填项

2、ADDCOLUMNS( table , name , expression ) 返回具有 DAX 表达式指定的新列的表。

     参数 table :The table to which new columns to be add   参数性质:必填项   不可重复

     参数 name : the name of new colunms to be add     参数性质:必填项    可重复

      参数 expression : the expression for the new columns to be add       参数性质:必填项    可重复

      例如:   ADDCOlLUMNS( '客户表 ,"相貌" , "美丽" ) 在客户表中增加“相貌”列,新增列以“美丽”文本填充。

3、SELECTCOLUMNS() 返回具有从表中选择的列以及 DAX 表达式指定的新列的表。

     参数 table :The table from  which  columns are  selected   参数性质:必填项    不可重复

     参数 name : the name of new colunms to be add   参数性质:必填项    可重复

     参数 expression : the expression for the new columns to be add       参数性质:必填项    可重复

4、UNION(Table , ……)返回其列相匹配的两个表格的联合。

     参数   table : a table that  will participate  in the  union    参数性质:必填项    可重复


注:生成新表的表样

构建客户职业表(其他表可以复制后,改变参数):

第一步   VAR 客户职业   =  DISTINCT ( '客户表'[ 职业] )  // 找出客户有什么不同的职业 ,返回只有一个列的表。

第二步   VAR 客户职业   =  ADDCOLUMNS(  DISTINCT ( '客户表'[职业] ), "元素类型" , "客户职业" ) 

               // 在 distint 返回表中,增加一列名为"元素类型" ,内容"客户职业", "客户职业"为表达式,如果再增加列,也依照"元素类型" , "客户职业"样式增加,为可复用。

第三步   VAR 客户职业   =  SELECTCOLUMNS(  ADDCOLUMNS( 

                                                                                                  DISTINCT ( '客户表'[职业] ),  

                                                                                                  "元素类型" , 

                                                                                                  "客户职业" ),

                                                                       "元素名称" , [职业] ,

// 对ADDCOLUMNS返回的表 选取列 职业列 取名 “元素名称” [职业]为表达式,

"元素类型" , [元素类型]        // 对ADDCOLUMNS返回的表选取列元素类型 取名 “元素类型”[元素类型]为表达式 ,此行为第二参数和第三参数的复用

                                                                      )

问题三:如何计算累计百分比?如何根据不同的类别正确累计百分比?

累计百分比= 不同类别的销售额 / 总销售额 * 100% 

分解: 1、总销售额 :即无论外部环境上下文如何变化, 销售额不受影响,是一个绝对常量,首先想到ALL ()函数或是 REMOVEFILTERS()函数,清除环境上下文的筛选;

                 DAX : 总销售额 = CALCULATE( sum('订单[销售额]) , ALL( 'ABC 元素表 ))

           2、累计销售额 :累计销售额,一定是一个迭加的过程,需要用到迭加函数,到底是哪个函数?

如果没有看到答案,我很难想到是用FILTER函数筛选而迭加!FILTER函数的第二参数为 Expression ,运用度量值进行筛选符合条件元素名称,再进行加计汇总。 迭代函数的神奇之处就是会在表内的每一行数据都会筛选一遍,找到符合条件的行而形成子集,进行计算。遗憾的是我的脑力实在不够,所以,只能就答案来解答案:

             VAR      totalsale = CALCULATE ('sum ( '订单[销售额] ) , ALL('ABC 元素表) )   

                               // 计算销售额的绝对值 ,用ALL函数做CALCULATE的筛选器时,清除环境上下文的影响,进行全集运算。

                VAR      currentevalue =  sum( '订单[销售额] )

                               // 指定视图层(环境上下文)某一类别的销售额,就是当前行的销售额。

                VAR      cumulativevalue = CALCULATE( sum( '订单[销售额] ) , FILTER( 'ABC 元素表 , sum( '订单[销售额] ) >= currentevalue ) )

                               // 这个是最难想的点:运用FILTER筛选器的迭加功能,在每一个当前值的位置上,通过ABC 元素表中每一个类别都进行一次筛选,寻找表中每一行的销售额>=当前行的销售额的行,将这些行筛选为一张表(计算的子集),再按CALCULATE函数的第一参数进行运算。

                RETERN  DIVIDE (cumulativevalue , totalsale )

                               // 返回累计占总额的百分比。

未完待续…………

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353