构建财务报表数据库

时间:2012-12-08 18:22:35

标签: sql sql-server database-design

我正在寻找构建数据库的最佳方法。我从1997年到2012年有1000个公司的季度财务报表。每家公司都有三种不同的报表,即损益表,资产负债表和现金流量表。

我希望能够对数据进行计算,例如将每个季度相加,以获得每个语句中每个订单项的年度总计。

到目前为止,我尝试了两种方法:

1)将每个语句的每个行项存储在它自己的表中,即Sales将是一个表,并且只有我正在跟踪的所有公司的销售数据,公司作为主键,每个季度数据作为单独的列。这似乎是处理数据的最简单方法,但每个季度更新数据非常耗时,因为有数百个表。

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           

这里的问题是当我尝试对这些数据进行年度化时,由于该群体的原因,我得到了一个非常难看的输出

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

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

每当我必须按财政季度,月份或年度或其他任何方式构建财务报告数据库时,我发现从星型模式设计和数据仓库借用一个概念很方便,即使我不是真正建立一个DW。

借用的概念是有一个表,我们称之为ALMANAC,每个日期都有一行,按日期键入。在这种情况下,自然键很好用。这里的依赖属性可以是日期所属的财务月份和季度,日期是企业营业的日期(TRUE或FALSE),以及公司日历中的其他任何怪癖。

然后,您需要一个只能从中生成此表的计算机程序。公司日历的所有奇怪规则都嵌入在这个程序中。 ALMANAC可以覆盖超过3,650行的十年时间。那是一张小桌子。

现在,只要您始终对日期使用Date数据类型,操作数据中的每个日期都可以像ALMANAC表中的外键一样使用。例如,每个销售都有销售日期。然后按财务季度或财政年度或任何您喜欢的方式进行汇总只需将操作数据与ALMANAC连接,并使用GROUP BY和SUM()来获取所需的汇总。

这很简单,它可以轻松生成大量的时间报告。

答案 1 :(得分: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:

的表中
Reports
--------
[Effective Date]
[CompanyID]
[AccountID]
[Amount]

您的帐户表将包含您要存储的内容(收入,费用等)的说明。您的[生效日期]列将链接回Dates表,该表描述您的数据属于哪个年份,季度等。从本质上讲,我所描述的是报告数据库的经典形状,称为star schema

答案 2 :(得分:0)

我可能会在一个数据表中使用以下结构:

Company
StatementType 
LineItem
FiscalYear
Q1, Q2, Q3, Q4

StatementType将是损益表,资产负债表或现金流量表。行项目将是声明中项目的编码/未编码文本,会计年度为2012年,2011年等。您仍然需要确保行项目在各公司之间保持一致。

这个结构可以让你查询flat语句 -

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

除了聚合。您可能希望为具有某种索引引用的行项目创建另一个表,以确保您可以按行项目的原始顺序拉回语句。

答案 3 :(得分:0)

对于财务报表数据库,有几点需要考虑:

  1. 筛选:数据库需要以这样一种方式进行组织,即可以在不同的时间点查询公司的指标。这可以用于筛选。

  2. 聚合:必须设置横截面数据集(例如索引成分的组合表),以便可以通过各种方式(按行业,国家/地区,风格因素等)进行汇总。

  3. 时间序列:数据应以时间序列格式提供,即索引序列尽可能高频率

  4. 可以说R是一个很好的工具,可以实现一个包含以上3点的结构。