2012-12-08 68 views
2

我正在尋找構建我的數據庫的最佳方式。我有從1997年至2012年的1000家公司的季度財務報表。每家公司都有三種不同的陳述,損益表,資產負債表和現金流量表。構建財務報表數據庫

我希望能夠對數據執行計算,例如將每個季度累計得到每個語句上每個行項目的年度總計。

我已經嘗試了兩種方式至今:

1)存儲每個行項目在它自己的表,即銷售的每個聲明將是一個表,對所有的公司,我只跟蹤銷售數據,以公司作爲主鍵和每個季度的數據作爲單獨的列。這似乎是處理數據的最簡單方法,但每個季度更新數據都非常耗時,因爲有數百個表。

 
Sales Table 
Company q32012 q22012 q12012 
ABC Co. 500 100 202 
XYZ Co. 230 302 202 

2)這是一個小更容易更新,但很難用數據進行工作的另一種選擇是有一個單獨的表中的每個公司的每個語句。例如,皇家銀行的利潤表將擁有自己的表格,其中主要欄是行項目。

 
Income Statement for Royal Bank 
Line_Item q32012 q22012 q12012 
Sales    
Net Profit   

這裏的問題是,當我嘗試按年這個數據,我得到一個非常難看的輸出,由於GROUP BY

SELECT  
(CASE WHEN Line_Item = 'Sales' THEN SUM(q4 + q3 + q2 + q1) ELSE '0' END) AS Sales2012, 
(CASE WHEN Line_Item = 'NetProfit' THEN SUM(q4 + q3 + q2 + q1) 
     ELSE '0' END) AS Inventories2012 
FROM   dbo.[RoyalBankIncomeStatement] 
GROUP BY Line_Item 

任何幫助,將不勝感激。

回答

2

我給你的建議是考慮不使用SQL數據庫來做到這一點。相反,可以考慮使用諸如SQL Server Analysis Services(SSAS)之類的東西。如果您想快速入門SSAS,我建議您加快PowerPivot for Excel的速度。準備好後,您可以將您在PowerPivot中開發的模型導入SSAS。

爲什麼我不推薦SQL?因爲您將在SQL Server中聚合帳戶時遇到問題。例如,您的資產負債表不會成爲您在SQL中輕鬆彙總的內容 - 請求SQL Server針對2010年的「現金」,例如,表示您希望獲得2010年12月底,而不是你想要彙總當年的現金(這將是一個無意義的數字)的所有條目。另一方面,通過收入和支出賬戶(例如那些將出現在收入報表中的賬戶),您將想要將這些值累加起來。更糟糕的是,有些報告會混合使用帳戶類型,這會使報告變得非常困難。

SSAS在產品內部提供了「知道」如何根據帳戶類型彙總報告的條款,並且有很多教程可以告訴您如何設置。

無論採用哪種方式,在將數據存入報告系統或Analysis Services多維數據集之前,都需要將數據存儲在某處。爲了做到這一點,你應該像這樣構造你的數據。比方說,你在表中存儲所謂的報告數據:

Reports 
-------- 
[Effective Date] 
[CompanyID] 
[AccountID] 
[Amount] 

你的帳戶表將有你想要什麼來存儲(收入,費用等)的說明。您的[生效日期]欄會連接到一個Dates表格,該表格描述您的數據屬於哪個年份,哪個季度等。實質上,我所描述的是報告數據庫的經典形狀,稱爲star schema

+0

+1戴夫。這絕對是星型模式。數據立方體和/或表格模型/ PowerPivot將非常適合按季度,帳戶和公司進行切片和切割,並快速返回結果。儘管如此,一個合適的星型模式設計幾乎是必不可少的。 – brian

0

我可能會在一個數據表中的下列結構去:

Company 
StatementType 
LineItem 
FiscalYear 
Q1, Q2, Q3, Q4 

StatementType是損益表,資產負債表和現金流量表。訂單項是報表中項目的編碼/未編碼文本,財年是2012,2011等。您仍然需要確保各個行項目在各個公司之間保持一致。

這種結構將讓您查詢扁聲明 -

select 
LineItem, Q1, Q2, Q3, Q4 
from Data 
where 
Company = 'RoyalBank' 
and FiscalYear = 2012 
and StatementType = 'Income Statement' 

環比

select 
FiscalYear, 
Q1 
from Data 
where 
Company = 'Royal Bank' 
and 
StatementType = 'Income Statement' 
and 
LineItem = 'Sales' 
order by FiscalYear 

除了聚集。您可能希望爲具有某種索引引用的訂單項添加另一個表格,以確保您可以按訂單項的原始順序將該語句拉回。

+0

我正在研究這兩個建議選項。使用SQL,我在下面創建了一個表,並推薦了一個小修改(一個字段中的所有值與另一個字段中的每個四分之一)。 公司\t StatementType \t的LineItem \t FiscalYear \t季度\t金額 WJX.TO \t利潤表\t銷售 Q3 \t 356.4 我可以得到年度總額沒有問題。然而,在進行除法時(例如,年利潤率(淨利潤/銷售額)),我得到了除以零的誤差。Nullif不起作用。 – user1886658

+0

SELECT Company,FiscalYear,LineItem(CASE WHEN Company ='WJX.TO'AND lineitem = 'Earnings'AND fiscalyear ='2011'THEN SUM(amount)ELSE 0 END)/(CASE WHEN Company ='WJX.TO'AND lineitem ='Sales'AND fiscalyear ='2011'THEN SUM(amount)ELSE 0 END) AS ProfitMargin2011 FROM dbo.FinancialData WHERE(StatementType = '利潤表')AND(公司= 'WJX.TO') GROUP BY公司,FiscalYear,LineItem的 我會在開始的PowerPivot/SSAS看現在也是如此。 公司\t StatementType \t LineItem \t FiscalYear \t Quarter \t Amount 個WJX.TO \t \t利潤表銷售\t \t \t 2012 Q3 \t \t \t 356.4 – user1886658

+0

ProfitMargin =情況下,當銷售= 0則0否則純利/銷售端 – kgu87

5

無論何時我需要根據會計季度,月份或年度或其他因素建立財務報告數據庫時,我發現從星型模式設計和數據倉庫中借用一個概念很方便,即使我沒有真正建立一個DW。

借來的概念是有一個表,讓我們把它年鑑,有一排每個日期,通過日期鍵。在這種情況下,一個自然鑰匙運作良好。這裏的依賴屬性可以是日期屬於哪個財政月和季度,無論該日期是企業開放的日期(TRUE還是FALSE),以及公司日曆中的其他怪癖。

然後,你需要的只是生成此表無中生有的計算機程序。公司日曆的所有奇怪規則都嵌入在這個程序中。 ALMANAC可以覆蓋超過3,650行的十年期。這是一張小桌子。

現在操作數據中的每個日期都可以像ALMANAC表中的外鍵一樣使用,前提是您始終使用日期的Date數據類型。例如,每次銷售都有銷售日期。然後按財政季度或財政年度或任何您喜歡的方式進行彙總僅僅是將操作數據與ALMANAC結合起來,然後使用GROUP BY和SUM()來獲得所需的彙總。

很簡單,它使生成時間段的整體筏報告變得輕而易舉。

0

財務報表數據庫有幾件事情需要考慮:

  1. 篩選:數據庫需要以這樣一種方式,它可以在不同的時間點被詢問公司的標準來進行組織。這可以用於篩選。

  2. 聚合:必須設置橫斷面數據集(例如指數成分股表格),以便以各種方式(按行業,國家,風格因素等)彙總它們。

  3. 時間序列:數據應該是時序格式即,可用索引系列儘可能高的頻率儘可能

會說R是實現併入了上述3個的結構的很大的工具點。