169_技巧_Power BI 依据促销日历计算销售金额

一、背景

在各位表格表姐们计算销售金额的时候,有一个绕不开的问题:商品有促销的问题,需要使用对应的促销价来计算销售额。

按照惯例还是先来看看结果

Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/169-full.html

二、场景解析

上图中结果其实非常简单,用一个矩阵就表示了结果。从DAX 建模和数据清洗还是有一定的要求。

数据采集需要符合业务需求和采集便利性。业务人员或者说我们数据的管理人员,更希望数据是在一行里面尽可能简短的表达完整我们的信息(拉链表)。但是在我们使用 DAX 做模型的时候,更希望看到的是流水表,这两点就是矛盾的。

接下来我们就使用 Power Query 来解决这个问题。

1、促销日历 & 价格表

案例中,价格表、促销日历都是使用拉链表的形式来记录信息。这不利于我们建模分析,于是需要使用 Power Query 来处理一下数据。

注意:促销日期展开拉链 ,这两个步骤,从拉链表展开到流水表。

let源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwMtY31jdU0oExLYDMp73Tn/bsAjKezdj3fMmupzNXANkGepamSrE6UD1GCD1ApgmQ/WTHHIimFw2bn83ZBdZhYaEUGwsA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [促销开始日期 = _t, 促销结束日期 = _t, 区域 = _t, 产品 = _t, 折扣 = _t]),更改的类型 = Table.TransformColumnTypes(源,{{"促销开始日期", type date}, {"促销结束日期", type date}, {"折扣", type number}}),促销日期 = Table.AddColumn(更改的类型, "促销日期", each List.Dates([促销开始日期], Number.From([促销结束日期]-[促销开始日期])+1, #duration(1,0,0,0))),展开拉链 = Table.ExpandListColumn(促销日期, "促销日期"),类型 = Table.TransformColumnTypes(展开拉链,{{"促销日期", type date}}),删除的列 = Table.RemoveColumns(类型,{"促销开始日期", "促销结束日期"})
in删除的列

注意:日期展开 这两个步骤,从拉链表展开到流水表。

let源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjIwMtY31DdU0oEyjfSNQZyXexY8W9AOZBgaGCjF6uBROGXd89kzwKL4Fb5o2Pxszi4gw4yAwmcz9j1fsuvpzBVAtiVCrRFCrRGmM40IKYQ505iAQrgzTQkoRHYmMJCAimMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [开始执行日期 = _t, 结束执行日期 = _t, 产品 = _t, 价格 = _t]),更改的类型 = Table.TransformColumnTypes(源,{{"开始执行日期", type date}, {"结束执行日期", type date}, {"产品", type text}, {"价格", Int64.Type}}),日期 = Table.AddColumn(更改的类型, "执行日期", each List.Dates([开始执行日期], Number.From([结束执行日期]-[开始执行日期])+1, #duration(1,0,0,0))),展开 = Table.ExpandListColumn(日期, "执行日期"),类型 = Table.TransformColumnTypes(展开,{{"执行日期", type date}}),删除的列 = Table.RemoveColumns(类型,{"开始执行日期", "结束执行日期"})
in删除的列

2、常规表格

销售明细按照常规的方式处理字段类型即可,同时准备好我们的日期表,维度表:区域表、产品表等。

3、表间关系

如下关系为: 多对一

  • ‘销售明细’[产品] --> ‘产品表’[产品]
  • ‘销售明细’[日期] --> ‘日期表’[Dates]
  • ‘销售明细’[区域] --> ‘区域表’[区域]
  • ‘促销日历’[促销日期] --> ‘日期表’[Dates]
  • ‘促销日历’[区域] --> ‘区域表’[区域]
  • ‘产品价格’[执行日期] --> ‘日期表’[Dates]
  • ‘产品价格’[产品] --> ‘产品表’[产品]
  • ‘促销日历’[产品] --> ‘产品表’[产品]

三、DAX

这里我们使用了两种方式来写度量值。一种是使用 LOOKUPVALUE ,这种写法可以如下关系去掉。

  • ‘促销日历’[促销日期] --> ‘日期表’[Dates]
  • ‘促销日历’[区域] --> ‘区域表’[区域]
  • ‘产品价格’[执行日期] --> ‘日期表’[Dates]
  • ‘产品价格’[产品] --> ‘产品表’[产品]
  • ‘促销日历’[产品] --> ‘产品表’[产品]
销售金额-LOOKUPVALUE =
VAR saleData =CALCULATETABLE ( '销售明细' )
VAR saleDataAdd =ADDCOLUMNS (saleData,"@price", LOOKUPVALUE ( '产品价格'[价格], '产品价格'[产品], '销售明细'[产品], '产品价格'[执行日期], '销售明细'[日期] ),"@promotion",VAR discount =LOOKUPVALUE ('促销日历'[折扣],'促销日历'[产品], '销售明细'[产品],'促销日历'[促销日期], '销售明细'[日期],'促销日历'[区域], '销售明细'[区域])RETURNIF ( ISBLANK ( discount ), 1, discount ))
VAR result =SUMX ( saleDataAdd, [@price] * [@promotion] * [销售量] )
RETURNresult

另外一种使用 RELATEDTABLE ,这种方式充分的利用到了维度表和事实表之间的关系

销售金额-RELATEDTABLE =
VAR saleData =CALCULATETABLE ( '销售明细' )
VAR saleDataAdd =ADDCOLUMNS (saleData,"@price", MAXX ( RELATEDTABLE ( '产品价格' ), '产品价格'[价格] ),"@promotion",VAR discount =MAXX ( RELATEDTABLE ( '促销日历' ), '促销日历'[折扣] )RETURNIF ( ISBLANK ( discount ), 1, discount ))
VAR result =SUMX ( saleDataAdd, [@price] * [@promotion] * [销售量] )
RETURNresult

对比两种写法的效率,明显能看到 销售金额-RELATEDTABLE销售金额-LOOKUPVALUE 更快。同时 DAX 代码量也相对更少。

四、总结

  1. 在数据收集和规范阶段,可以把数据要求为拉链表的形式,更便于对业务人员对数据的维护,同时也能很好的使用 Power Query 来做数据清洗便于建立分析模型。

  2. 类似促销日历的这种形式,在 dax 建模的时候,我们使用一层一层的迭代的形式往数据上去叠加,同时需要考虑数据最小粒度,这里的价格表和促销日历,我们是使用日期来进行约束描述的。这样能应对不同形式的价格调整,不会对模型造成的影响。

  3. 当前案例对表间关系的理解需要到位,不然容易使用 LOOKUPVALUE ,当然无论什么方式,只要能解决业务问题都是好的方式,只是效率相对低一些。

请关注


全网同名搜索 焦棚子

如果对你有帮助,请 点赞关注三连 支持一下,这是我们更新的动力。

by 焦棚子

169_技巧_Power BI 依据促销日历计算销售金额相关推荐

  1. # 160_技巧_Power BI 新函数-计算工作日天数

    160_技巧_Power BI 新函数-计算工作日天数 一.背景 Power BI 2022 年 7 月 14 日更新了最新版本的,版本号为:2.107.683.0 . 更多更新内容可以查看官方博客: ...

  2. 174_技巧_Power BI 动态格式(万|亿)

    174_技巧_Power BI 动态格式(万|亿) 一.背景 Power BI 2023年4月份更新,新增加了一个预览功能:动态格式(Dynamic format strings for measur ...

  3. 178_技巧_Power BI 动态排名多项展示

    178_技巧_Power BI 动态排名多项展示 一.背景 在 Power BI 中做排名矩阵时,我们经常遇到同一维度下,多项展示排名的问题.类似这样的排名矩阵,排名的名次不会太多,但是同一维度下会有 ...

  4. power bi 中计算_Power BI中的期间比较

    power bi 中计算 Just recently, I've come across a question on the LinkedIn platform, if it's possible t ...

  5. 155_模型_Power BI Power Pivot 进销存之安全库存

    155_模型_Power BI & Power Pivot 进销存之安全库存 一.背景 谈进销存的概念时,我们也需要提及另外一个概念:安全库存. 库存周转在理想的状态下是做到零库存,但是在内部 ...

  6. 164_技巧_Power Query 之巧解-外部表不是预期的格式

    164_技巧_Power Query 之巧解-外部表不是预期的格式 一.背景 在 Power Query 清洗数据的时候,大概率都遇到过 外部表不是预期的格式. 二.问题解析 像这样的情况,大多数情况 ...

  7. 体系结构方案 -BI 系统的前置计算

    存在问题:BI 系统后台计算由中央分布式数据仓库(MPP)实现,性能不佳,导致交互式多维分析响应迟钝. 产生的原因:中央数据仓库上挂数十个应用,计算负担太重! 解决方案:数据前置计算 / 缓冲层,由应 ...

  8. 158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能

    158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能 一.背景 最近对 Power BI 中使用 SVG 比较感兴趣,今天我们使用 DAX + SVG 复刻一下 Ze ...

  9. 增长量计算n+1原则_数资备考技巧——资料分析题型之增长量计算

    原标题:数资备考技巧--资料分析题型之增长量计算 接下来,我们一起来练习几道增长量计算类的题目: [例1](2019河北) 2014-2018年年末移动电话用户和固定互联网宽带接入用户数 与2017年 ...

最新文章

  1. BiB:王秀杰/裴小兵合作开发单细胞组学细胞标记基因鉴定算法COSG
  2. linux gdb 运行的程序,GDB(十)--调试正在运行的进程
  3. reeten lock java_Java多线程分析(八)----Syschronized VS ReentrankLock
  4. Cannot create a session after the response has been committed的处理
  5. 小学生学python-小学生都学Python了,你还不知道如何开始
  6. POJ 1422 Air Raid (最小路径覆盖)
  7. vscode编辑器 装JavaScript Standard Style 遇到不检测代码问题
  8. jqGrid获取一行数据的方法
  9. express中 routes/index.js
  10. Java修改文件MD5值-yellowcong
  11. 计算机应届博士生的一点求职经验——概述篇
  12. java vad_(转载)静音检测VAD算法
  13. 基于《狂神说Java》Redis--学习笔记
  14. 没有技术说明文档的开源都是耍流氓:微软Roslyn编译即服务在CIIP中具体应用(上)...
  15. 信源编码与信道编码-Source coding Channel coding
  16. ThreadLocal 简单了解
  17. python 新式类与旧式类的区别
  18. Linux入门学习笔记之基础
  19. 广播 (Broadcast)
  20. 数据恢复顾问(DRA)

热门文章

  1. 面向对象设计 — 类和对象
  2. 基于android的网络音乐播放器-下载完成后下拉音乐列表刷新(八)
  3. 嵌入式Linux的基本命令
  4. 【计算机组成与结构】期末复习DAY1
  5. Cleanup has successfully processed the following paths
  6. Java学习第一周 equals的含义 equals与==区别
  7. JAVA学习日记《一》
  8. 常见的web攻击技术
  9. win7 卸载IE10
  10. 怎么才能让抖音快速涨粉,抖音涨粉最快的内容有哪些?如何去做?