点击“数字化审计”,可以关注哦!

开篇啰嗦话

在前文“Dax实战-多年财务报表项目存在串行的合并”中,我为你介绍了多年财务报表合并过程中问题的起因和解决串行合并的关键方案-取项目的行次最大值,并用纯DAX和DAX+Vlookup给出解决方案。下面为你剖析DAX语法,并给出数据库查询语言SQL和Python的解决方案,以期你能举一反三。

重温多年报表合并后报表项目行次确定机制

下图展示了2017、2018年利润表主要项目及其行次。

可以看出,2018年新增“主营税金及附加导致“销售费用”-“投资净收益”行次行相对2017年均+1;2018年新增”其他收益”项目,导致后续项目行次+2。每年财务报表项目会有所调整(增加或减少),当把多年利润表合并在一张表中,形成数据库表,同一个项目会有多个行次。下图是仅筛选了“销售费用”和“营业利润”。

如上文所述,“销售费用”的最终行次=max(4,5)=5;“营业利润”的最终行次=max(12,14,16)=16。

其中,max函数是取一组数中的最大值。

那么,应如何取出项目名称和该项目对应的最大行次,这需要用到分组合并函数group。下图是DAX、Sql、Python的group语法:

语言 语法:按项目进行分组,并取行次最大值

DAX

groupby(lirunbiao,lirunbiao[项目],

"hc",maxx(currentgroup(),lirunbiao[行次]))

SQL

select 项目,max(行次)  as hc FROM [test].[dbo].[lrb]
group by 项目

python:1 调用dataframe的read_sql函数,所以语法也是与sql一样
python:2 df.groupby("项目").aggregate({"行次":"max"})

下图是对3年利润表按照项目进行分组,取行次最大值后的结果。

剩下的就是按照项目名称取得2017-2019年的本年累计值。由于三年的利润表整合在一张表上了,如本文第2张图。需要按年拆分成三张表,然后根据项目名称进行关联(vlookup),取得每年的”本年累计值”,下面演示了取得三年值的分解步骤。

下面分别为你介绍用Sql、DAX、Python三种方式实现上述逻辑的算法和代码。

Sql的计算逻辑

因为sql处理起来最简单,所以先介绍sql的操作。

我这是用sql server来编写的,不同的数据库,如oracle、sql server、Mysql、Sqlite、DB2、Sybase等,其语法会存在一定的差异,但select语法基本一致,详情请参考各自数据库的描述。

关于sql server的下载、安装请自行在网上查找。建议你下载并安装sql server2019,因为它能更好的支持基于pyton的机器学习,我会在后面系统地为你介绍sql开展数据分析、利用sqlserver中的python来开展机器学习,敬请留意!

01.获取每个项目的行次最大值并保存到视图lrbsort

create view lrbsortas--取得每个项目的行次最大值SELECT 项目,max(行次)  as hc FROM [test].[dbo].[lrb]group by 项目

02.从利润表lrb中分别筛选出2017-2019年的本年累计值,并与lrbsort进行左关联,形成结果表。

lj2019from lrbsort aleft join (select [项目],[本年累计] as lj2017 from lrb where [年度]=2017) b on a.项目=b.项目

DAX的计算逻辑

因为DAX的连接没有sql那么容易,需要分步连接。

01.获取每个项目的行次最大值并保存到变量xm

DEFINE//这是整个程序最为关键最为核心的代码,关键是max,//利用group by 对项目分组,当一个项目在三年的行次不一样,取其最大值var xmlist=GROUPBY(lirunbiao,lirunbiao[项目],"hc",maxx(CURRENTGROUP(),lirunbiao[行次]))// 务必要用SELECTCOLUMNS将xmlist重新形成xm,否则//在执行NATURALLEFTOUTERJOIN时出现错误,// 错误信息:“未检测到公共联接列。联接函数“ NATURALLEFTOUTERJOIN ”至少需要一个公共联接列”var xm=SELECTCOLUMNS(xmlist,"项目",[项目],"hc",[hc])

02.从利润表lrb中分别筛选出2017-2019年的本年累计值

//从利润表lirunbiao中筛选出不同年度的记录并保存到不同的变量中var t2017=FILTER(lirunbiao,lirunbiao[年度]=2017)var t2018=FILTER(lirunbiao,lirunbiao[年度]=2018)var t2019=FILTER(lirunbiao,lirunbiao[年度]=2019)//获取2017年的本年累计数并保存到变量中var m2017=SELECTCOLUMNS(t2017,"项目",[项目],"2017",[本年累计])var m2018=SELECTCOLUMNS(t2018,"项目",[项目],"2018",[本年累计])var m2019=SELECTCOLUMNS(t2019,"项目",[项目],"2019",[本年累计])

03.与xm进行左关联,形成结果表b4,并用evaluate显示出来

2017

Python的计算逻辑

关于Python及其编辑器的下载、安装请自行在网上查找。python建议你下载并安装最新的、适合数据分析的python开源版本Anaconda,编辑器建议你下载微软的vscode。

关于如何利用python进行审计数据分析,我将在后续课程陆续讲解,敬请留意!

基于Python的计算逻辑在代码注释里我写的很清楚了,不再叙述。

import pandas 

上面用三种方式为你详细地介绍了多年报表合并后,报表项目行次发生变化,导致合并困难的解决方案。其中,DAX适合EXCEl中级使用者,SQL和Python则适合具有一定的数据分析技能的审计人员。

或许,你尚处于Excel的初级阶段,实施审计数据分析尚有一定难度。SQL和Python可能闻所未闻,更不用说去使用它,不要着急,如果你愿意跟着我的脚步,潜心研究,你终将步入审计数据分析大师的行列。

期待你跟着我一起进步和提高!

有你的期待和支持,我会不懈地牺牲自己的休息时间努力爬格子!

随着轻轻的风轻轻地飘

历经的路都会刻骨铭心

如果你觉得有用,记得点击右下角“在看”按钮,并写下宝贵的意见,也可在公众号下扫码加群

欲见详情,静候下文

原创文章欢迎转载!

请注明:本文首发于

"数字化审计"公众号

dataframe两个表合并_DAXSQLPython实现报表项目存在串行的财务报表合并相关推荐

  1. dataframe两个表合并_Spark实战第二版(涵盖Spark3.0)第三章 宏伟的角色dataframe

    关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人.您的分享,是作者翻译的动力! 本章涵盖了 使用 ...

  2. dataframe两个表合并_DataFrame踩坑整理(一)

    不得不说,工作中几乎天天跟DataFrame打交道,真的很有总结和记住的必要,话不多说,直接上干货.输入以下语句前别忘记: import pandas as pd import numpy as np ...

  3. dataframe两个表合并_Part25:Pandas基础(Series,DataFrame类的创建、索引、切片、算术方法)...

    一.为什么学习pandas numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢? numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类 ...

  4. dataframe两个表合并_史上代码最少的工作表拆分,仅需5行,不可思议

    工作中,很多小伙伴都会遇到一些需求,将一份Excel文档按照部门进行拆分,每个部门是一个单独的工作表,或者每个部门整理的工作表汇总为一份总的工作表.读者需要注意的是,多个工作表的拆分与合并,始终在一个 ...

  5. dataframe两个表合并_R语言读取多个excel文件后合并:rbind/merge/cmd合并

    问题: 该文件夹下的三个文件理论上列名完全一致,但是在用rbind合并时却提示上述错误,(只能理解为列名确实是不一致导致的问题)解决如下: (1)首先,rbind和cbind()也适用于datafra ...

  6. dataframe两个表合并_Spark DataFrame 不是真正的 DataFrame

    从这篇文章开始,我们专栏开始一个新的读 paper 系列. 今天要介绍的 paper 是 Towards Scalable Dataframe Systems,目前还是预印本.作者 Devin Pet ...

  7. oracle 两表两列数据对比_当表中的列数不同时,如何比较oracle中的两个表

    INTRO:下面我将展示如何做到"手工"这些工具(例如SQL Developer)可以做得更快更好.我对此(和你的!)的兴趣是双重的:学习和使用一些可以帮助解决许多其他问题的想法; ...

  8. python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...

    Python中Dataframe对象如何将两个具有相同列名的表叠加起来,从行上叠加起来,组成一个表. 例如,有两个表,表的列名是相同的.如何将一个条的记录添加的另一个表的记录下面,形成一个新的表? 举 ...

  9. C#合并两张表结构相同(列数和列类型都相同)的表

    DataTable appendDataTable=new DataTable(); 这个合并的大前提是两张表的结构相同且列的类型也必须相同 否则在赋值时就会出现异常. for (int i = 0; ...

最新文章

  1. NAT,Easy IP
  2. 动手动脑问题2加课堂练习
  3. java加按钮_如何从零开始对接第三方登录(Java版):QQ登录和微博登录
  4. 蓝桥练习-算法训练 P0505
  5. List和Set集合使用
  6. matlab特征值分解法求多自由度系统的固有频率和主振型
  7. 代码 纪录 软件_「软件资料」-「资讯动态」-软件开发类项目关键文档内容要求...
  8. 《统计学习方法》代码全解析——第四部分朴素贝叶斯
  9. 伪元素在父元素中居中_从ArrayList中移除元素
  10. 正确使用“下划线”一词
  11. html5直播礼物动画,GitHub - General757/giftanim: 直播礼物动画 送赞送礼物动画 仿映客礼物动画侧栏弹出送花人和礼物以及x1 x2 x3效果,支持队列 排序...
  12. C语言实现蔡勒公式求周几
  13. Saber 基本操作学习-Buck仿真实例
  14. 设计模式——观察者模式(海姆达尔与仙宫人民)
  15. 浅谈C++中的多线程(一)
  16. 空洞卷积感受野的正确计算方法
  17. R报错:caret包与InformationValue包在绘制confusionmatrix时遇到的问题
  18. 计算机管理日志清除怎么清除,电脑使用记录清除技巧大全
  19. 网络管理员需了解的主要职责!
  20. 韩信点兵,在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,

热门文章

  1. SAP BRF+ Interpretation Mode与Generation Mode
  2. use SQVI to display table join
  3. SAP UI5 函数节流和异步完成令牌的应用
  4. 五天学习Mysql数据库教程(一)1.1数据库的基本概念
  5. 3d需要学linux_我的脑子—从核磁共振图像到3D打印
  6. python求两数之和的命令_python实现读取命令行参数的方法
  7. python 读取文件_python读取docx文件,就是如此简单
  8. HDFS基本概念和特性的详情了解及优缺点
  9. linux ls in*,35 ls Command Examples in Linux (The Complete Guide)
  10. erp系统服务器怎么关机,服务器怎么设置自动关机