首页 > 其他分享 >182_Power BI 使用 DAX 按照先进先出原则计算毛利润

182_Power BI 使用 DAX 按照先进先出原则计算毛利润

时间:2023-07-03 18:12:08浏览次数:45  
标签:Power BI cumIn date VAR 先进先出 入库 出库

182_Power BI 使用 DAX 按照先进先出原则计算毛利润

一、背景

在笔者以往的文章中也有先进先出的案例,可以参考(https://jiaopengzi.com/?s=先进先出)。

今天我们来看一个网友提出的问题,

  • 先进先出的原则,
  • 入库和出库的价格都是不统一的。
  • 按照出库的日期来计算先进先出的sku的毛利(fifo_profit)。

如下:

图-01

二、DAX

表间关系

我们这里按照正常业务逻辑需要有日期表:calendar、入库表:storage、出库表:sale

关系如下:

图-02

关键的 DAX 如下,@result为需要的结果:

图-03

DEFINE
/*先进先出毛利润计算*/
VAR tableSale =  ALL( 'sale' )
VAR tbaleStorage =  ALL ( 'storage' )
VAR tableIn =
    /*计算每条入库记录的累计入库:@cumIn*/
    ADDCOLUMNS (
        tbaleStorage,
        "@cumIn",
            VAR dateIn = [date]
            VAR skuIn = [sku]
            VAR tableInX =
                FILTER ( tbaleStorage, [sku] = skuIn && [date] <= dateIn )
            RETURN
                SUMX ( tableInX, [units] )
    )
VAR tableOut =
    /*计算每条出库记录的累计出库:@cumOut*/
    ADDCOLUMNS (
        tableSale,
        "@cumOut",
            VAR dateOut = [date]
            VAR skuOut = [sku]
            VAR tableOutX =
                FILTER ( tableSale, [sku] = skuOut && [date] <= dateOut )
            RETURN
                SUMX ( tableOutX, [units] )
    )  
VAR tableResult =
    /*掐头去尾找到出库和入库的对应关系,计算出销售金额和入库成本之间的差异计算出毛利润*/
    ADDCOLUMNS (
        tableOut,
        "@result",
            VAR dateOut = [date]
            VAR cumOut = [@cumOut]
            VAR skuAc = [sku]
            VAR tableOutPre =
                FILTER ( tableOut, [sku] = skuAc && [date] < dateOut ) //前一个@累计出库
            VAR preMaxCumOut =
                MAXX ( tableOutPre, [@cumOut] )
            VAR tableInStartEnd = // 先进先出规则下,出库数据对应到入库数据
                FILTER (
                    tableIn,
                    [sku] = skuAc && [date] <= dateOut && [@cumIn] >= preMaxCumOut
                )
            VAR tableInOut =// 计算每次入库记录对应到出库的数量
                ADDCOLUMNS (
                    tableInStartEnd,
                    "@unitOut",
                        VAR dateMin =
                            MINX ( tableInStartEnd, [date] )
                        RETURN
                            SWITCH (
                                TRUE (),
                                cumOut > [@cumIn] && [date] = dateMin, [@cumIn] - preMaxCumOut,
                                cumOut > [@cumIn], [units],
                                cumOut - [@cumIn] + [units]
                            )
                )
            VAR tableOkCum =  FILTER ( tableInOut, [@cumIn] >= cumOut ) // 每条记录 满足累计入库大于等于出库
            VAR dateMin =MINX ( tableOkCum, [date] )
            VAR tableOkDate = FILTER ( tableInOut, [date] <= dateMin ) // 每条记录 日期小于等于 dateMin
            VAR cost = SUMX ( tableOkDate, [price] * [@unitOut] ) // 计算出库成本
            VAR profit = [price] * [units] - cost // 计算毛利
            RETURN
                profit
    )
EVALUATE
tableResult

三、总结

  1. 先进先出的主要方法是"掐头去尾",找到出库信息对应到的入库信息。
  2. 按照每行记录计算出库和入库数量累计值,再通过迭代函数计算对应的入库成本和出库销售额,从而通过差异计算出毛利。
  3. 由于业务嵌套层数比较多,可以利用 Dax Studio 调试,多使用 CONCATENATEX

附件下载

https://jiaopengzi.com/3026.html


请关注

全网同名搜索 焦棚子

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

我们承接 Power BI 相关业务:培训、报告制作与部署、咨询服务等。

图-04

by 焦棚子

标签:Power,BI,cumIn,date,VAR,先进先出,入库,出库
From: https://www.cnblogs.com/jiaopengzi/p/17523607.html

相关文章

  • Combinatorics
    长期更新。CF626FGroupProjects写了。CF1580BMathematicsCurriculum答辩题\(n^5\)过100这个题目的条件是笛卡尔树的层数,考虑的意义是对于每个区间求LCA那么LCA必然处于\(i\)到根节点的链上。求的就是构建点的个数为\(n\),深度为\(m\)的儿子个数有\(k\)个......
  • PowerShell系列零:为什么值得学习
    自我介绍我的职业是网管,工作环境是中小企业。从业十几年了,一直都是一个人一个部门,什么都做。硬件、弱电、网络、系统、服务器、冗余、灾备。大概从5-6年前开始接触PowerShell,尝试着在日常工作中把常用的操作从GUI转向到使用PowerShell去操作。基本上就是总结一下哪些问题是经常发......
  • SPINAND UBI 离线烧录 开发指南
    SPINANDUBI离线烧录开发指南1概述编写目的:介绍SunxiSPINand烧写时的数据布局2名词解释词义UBIunsortedblockimagePEBphysicaleraseblockLEBlogicaleraseblockPEB和logicalblock关系1PEB=1logicalblock1logicalblock=2physicalblocks3总体数据布局ub......
  • 全志Tina Linux SPINAND UBI 离线烧录 开发指南 支持百问网T113 D1-H哪吒 DongshanPI-
    1概述编写目的:介绍SunxiSPINand烧写时的数据布局2名词解释词义UBIunsortedblockimagePEBphysicaleraseblockLEBlogicaleraseblockPEB和logicalblock关系1PEB=1logicalblock1logicalblock=2physicalblocks3总体数据布局ubi方案FLASH上的数据布局sys_pa......
  • 关于Linux系统下-zabbix-agent-的安装
    本文主要讲解关于Zabbix-Agent在Linux系统下的安装可以针对于如下一些系统AmazonLinux1/2 RedHatEnterpriseLinuxServerrelease6.XRedHatEnterpriseLinuxServerrelease7.X1、到Zabbix官方,下载并安装软件包(AmazonLinux1使用RHEL6的安装包,AmazonLinux2使......
  • PowerShell 中有许多用于获取信息的 Get 命令
    PowerShell中有许多用于获取信息的Get命令。以下是一些常用的Get命令示例:Get-Process:获取正在运行的进程列表。Get-Service:获取正在运行的服务列表。Get-EventLog:获取事件日志条目。Get-Content:获取文件的内容。Get-ChildItem:获取文件和文件夹的列表。Get-WmiObject:获......
  • BackUpLogView 系列 - Powershell 在任务计划中执行脚本
     在windows系统中,使用powershell执行脚本,请在写字板中调整相关参数,注意把参数一次性拷贝完整。之所以选择带参数的原因,是避免powershell打开时出现安全性限制对话框导致执行失败powershell.exe-NonInteractive-NoProfile-NoLogo-ExecutionPolicyUnrestricted-File......
  • PowerShell脚本数字签名错误
    1.以管理员身份打开powershell,使用get-executionpolicy-list查看策略设置2.将所有的scope的值为:undefined具体设置的命令是:Set-ExecutionPolicy-ExecutionPolicyundefined-ScopeLocalMachine3.找到报错中提示中有问题的xxx.ps1脚本,选中该脚本,右键选择属性,然后勾选“解......
  • Mac中VscodeC++万能头文件配置bits/stdc++.h
    /Library/Developer/CommandLineTools/usr/include路径下创建bits文件夹新建stdc++.h头文件,内容如下//C++includesusedforprecompiling-*-C++-*-//Copyright(C)2003-2018FreeSoftwareFoundation,Inc.////ThisfileispartoftheGNUISOC++Library.T......
  • [香橙派]debian server安装桌面
    1.首先,安装Tasksel实用程序以安装桌面环境:sudoaptinstalltasksel–y2.安装Tasksel后,使用以下命令启动Tasksel实用程序:(用空格键选中)sudotasksel......