3

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

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

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

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

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

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

皇家银行损益表
Line_Item q32012 q22012 q12012
销售量            
净利           

这里的问题是,当我尝试对这些数据进行年度化时,由于 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

任何帮助,将不胜感激。

4

3 回答 3

5

每当我必须按财政季度、月份或年份或其他任何时间为财政报告构建数据库时,我发现从星型模式设计和数据仓库中借用一个概念很方便,即使我并没有真正构建一个德威。

借用的概念是有一个表,我们称之为 ALMANAC,每个日期有一行,以日期为键。在这种情况下,自然键效果很好。此处的相关属性可以是日期所属的财政月份和季度,日期是否是企业营业的日期(真或假),以及公司日历中的任何其他怪癖。

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

现在,操作数据中的每个日期都可以用作 ALMANAC 表中的外键,前提是您始终使用 Date 数据类型作为日期。例如,每笔销售都有销售日期。然后按财政季度、财政年度或任何您喜欢的方式进行汇总,只需将运营数据与 ALMANAC 结合起来,并使用 GROUP BY 和 SUM() 即可获得所需的汇总。

这很简单,它使生成大量时间段报告变得轻而易举。

于 2012-12-09T06:47:42.170 回答
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]

您的 Account 表将包含您尝试存储的内容(收入、支出等)的描述。您的 [Effective Date] 列将链接回一个Dates表格,该表格描述您的数据所属的年份、季度等。本质上,我所描述的是一种用于报告数据库的经典形状,称为星型模式

于 2012-12-08T18:41:58.873 回答
1

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

Company
StatementType 
LineItem
FiscalYear
Q1, Q2, Q3, Q4

StatementType 可以是损益表、资产负债表或现金流量表。行项目将是报表上项目的编码/未编码文本,财政年度是 2012 年、2011 年等等。您仍然需要确保 Line Items 在公司之间保持一致。

这种结构可以让您查询平面语句 -

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

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

于 2012-12-08T18:50:15.937 回答