【问题标题】:Structuring Databases for Financial Statements为财务报表构建数据库
【发布时间】:2012-12-08 18:22:35
【问题描述】:

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

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

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

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

销售表 公司 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

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server database-design


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案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]
      

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

      【讨论】:

      • +1 戴夫。这绝对是星型模式。数据立方体和/或表格模型/PowerPivot 非常适合按季度、帐户和公司进行切片和切块,并快速返回结果。不过,适当的星型模式设计几乎是这些要求的必要条件。
      【解决方案3】:

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

      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
      

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

      【讨论】:

      • 我正在研究推荐的两个选项。使用 SQL,我在下面创建了一个表,建议稍作修改(一个字段中的所有值与单独字段中的每个季度)。 Company StatementType LineItem FiscalYear Quarter Amount WJX.TO IncomeStatement Sales 2012 Q3 356.4 我可以得到年度总计没有问题。但是,在进行除法时,我得到除以零的错误(即年度利润率(净利润/销售额)。Nullif 没有帮助。
      • SELECT Company, FiscalYear, LineItem, (CASE WHEN Company = 'WJX.TO' AND lineitem = 'Earnings' AND 会计年度 = '2011' THEN SUM(amount) ELSE 0 END) / (CASE WHEN公司 = 'WJX.TO' AND lineitem = 'Sales' AND 财政年度 = '2011' THEN SUM(amount) ELSE 0 END) AS ProfitMargin2011 FROM dbo.FinancialData WHERE (StatementType = 'IncomeStatement') AND (Company = 'WJX.TO ') GROUP BY Company, FiscalYear, LineItem 我现在也将开始研究 PowerPivot/SSAS。 Company StatementType LineItem FiscalYear Quarter Amount WJX.TO IncomeStatement Sales 2012 Q3 356.4
      • ProfitMargin = 销售额 = 0 则为 0 的情况,否则为 NetProfit / 销售结束
      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多