dataframe两个表合并_DAXSQLPython实现报表项目存在串行的财务报表合并
開篇啰嗦話
在前文“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] |
| 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.獲取每個項目的行次最大值并保存到視圖lrbsortcreate view lrbsortas
--取得每個項目的行次最大值
SELECT 項目,max(行次) as hc FROM [test].[dbo].[lrb]
group by 項目
02.從利潤表lrb中分別篩選出2017-2019年的本年累計值,并與lrbsort進行左關聯,形成結果表。lj2019
from lrbsort a
left join (select [項目],[本年累計] as lj2017 from lrb where [年度]=2017) b on a.項目=b.項目DAX的計算邏輯
因為DAX的連接沒有sql那么容易,需要分步連接。
01.獲取每個項目的行次最大值并保存到變量xmDEFINE//這是整個程序最為關鍵最為核心的代碼,關鍵是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顯示出來2017Python的計算邏輯
關于Python及其編輯器的下載、安裝請自行在網上查找。python建議你下載并安裝最新的、適合數據分析的python開源版本Anaconda,編輯器建議你下載微軟的vscode。
關于如何利用python進行審計數據分析,我將在后續課程陸續講解,敬請留意!
基于Python的計算邏輯在代碼注釋里我寫的很清楚了,不再敘述。
import pandas上面用三種方式為你詳細地介紹了多年報表合并后,報表項目行次發生變化,導致合并困難的解決方案。其中,DAX適合EXCEl中級使用者,SQL和Python則適合具有一定的數據分析技能的審計人員。
或許,你尚處于Excel的初級階段,實施審計數據分析尚有一定難度。SQL和Python可能聞所未聞,更不用說去使用它,不要著急,如果你愿意跟著我的腳步,潛心研究,你終將步入審計數據分析大師的行列。
期待你跟著我一起進步和提高!
有你的期待和支持,我會不懈地犧牲自己的休息時間努力爬格子!
隨著輕輕的風輕輕地飄
歷經的路都會刻骨銘心
如果你覺得有用,記得點擊右下角“在看”按鈕,并寫下寶貴的意見,也可在公眾號下掃碼加群。
欲見詳情,靜候下文原創文章歡迎轉載!
請注明:本文首發于
"數字化審計"公眾號
總結
以上是生活随笔為你收集整理的dataframe两个表合并_DAXSQLPython实现报表项目存在串行的财务报表合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat4/5连接池的设置及简单应用
- 下一篇: python如何定义类_python类定