构建财务报表数据库



我正在寻找构建数据库的最佳方式。我有1997-2012年1000家公司的季度财务报表。每家公司都有三份不同的报表,一份利润表、一份资产负债表和一份现金流量表。

我希望能够对数据进行计算,例如将每个季度相加,以获得每个报表上每个行项目的年度总数。

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

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

销售表公司q32012 q22012 q12012ABC公司500 100 202XYZ公司230 302 202

2)另一个更容易更新但更难处理数据的选项是为每个公司的每个语句创建一个单独的表。例如,皇家银行的损益表将有自己的表,主列为行项目。

皇家银行损益表行_项目q32012 q22012 q12012销售额净利润

这里的问题是,当我试图按年计算这些数据时,由于的分组,我得到了非常糟糕的输出

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

如有任何帮助,我们将不胜感激。

每当我必须按会计季度、月份或年份或其他方式为财务报告构建数据库时,我发现借用星型模式设计和数据仓库的概念很方便,即使我并没有真正构建DW。

借用的概念是有一个表,我们称之为ALMANAC,它为每个日期有一行,由日期键控。在这种情况下,自然键效果很好。这里的相关属性可以是日期属于哪个会计月和会计季度,该日期是否是企业开业的日期(TRUE或FALSE),以及公司日历中的任何其他怪癖。

然后,你需要一个计算机程序,它可以从无到有地生成这个表。公司日历的所有奇怪规则都嵌入到这个程序中。ALMANAC可以在3650多行中覆盖十年的时间。那是一张小桌子。

现在,操作数据中的每个日期都可以像ALMANAC表中的外键一样使用,前提是始终使用date数据类型表示日期。例如,每次销售都有一个销售日期。然后,按财政季度、财政年度或任何您喜欢的方式进行聚合,只需将运营数据与ALMANAC连接起来,然后使用GROUP by和SUM()来获得您想要的聚合。

它很简单,生成一大堆时间段的报告就轻而易举了。

我给您的建议是考虑不要使用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表,该表描述了您的数据所属的年份、季度等。本质上,我所描述的是报告数据库的一种经典形状,称为星形模式。

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

Company
StatementType 
LineItem
FiscalYear
Q1, Q2, Q3, Q4

报表类型为损益表、资产负债表或现金流量表。行项目将是报表上项目的编码/未编码文本,会计年度为2012年、2011年等等。您仍然需要确保各公司的行项目一致。

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

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

QoQ

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

除骨料外。您可能希望为行项目提供另一个表,该表具有某种索引引用,以确保可以按行项目的原始顺序将语句拉回来。

最新更新