【问题标题】:Calculate balance sheet with fastest algorithm用最快的算法计算资产负债表
【发布时间】:2016-05-12 05:24:12
【问题描述】:

我正在实施会计软件。

在计算分层自引用主题的资产负债表时,请告诉我最快的算法

这些是我的桌子:

主题表:

TopicID nvarchar(50) -- is Parent Field
ParentID nvarchar(50) -- is Child Field
Description nvarchar(512) 
------------DocumentDetal table
DocumentNumber nvarchar(50)
TopicFK nvarchar(50)  
Debit decimal(18,0)
Credit decimal(18,0)

两个表与TopicIDTopicFK 列相关,请告诉我如何使用SQL 存储过程计算资产负债表。

以下是数据样本:

以下是文档:

其实我想要以下计算结果:

【问题讨论】:

  • 这里的一些成员可能擅长算法,但不擅长会计。那么你能解释一下从你的表格中计算资产负债表的逻辑吗? 样本数据期望输出更好。
  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • @PhamX.Bach 提供了其他信息,请对此提供帮助。
  • 你是说把c#和SQL Server放在一起是想让我们写一些c#代码,或者更确切地说是SQL?你写了一些关于过程的东西,但是 c# 标签有点误导
  • @JakubSzumiato 我想写 sql 存储 proc 并在 c# 中使用 proc 但我的问题只是 sql。

标签: sql performance tree sql-server-2008-r2


【解决方案1】:

为您的SQL Server 2008 R2,这里是sumDebit and sumCredit。不明白如何计算 Res Debit and Res credit,但我认为您也可以编辑以获取您的 Res value

无论如何,这是使用CTE 感谢Mikael Eriksson in Recursive sum in tree structure

with T as
(   
    select t.TopicID, t.ParentID, sum(d.Debit) as sumDebit, sum(d.Credit) as sumCredit
    from Topics t
    left join DocumentDetail d 
    on t.TopicID = d.TopicFK
    group by t.TopicID, t.ParentID
)
,C as
(
    select T.TopicID,
         T.sumDebit,
         T.sumCredit,
         T.TopicID as RootID
    from T
    union all
    select T.TopicID,
         T.sumDebit,
         T.sumCredit,
         C.RootID
    from T
    inner join C 
    on T.ParentId = C.TopicID
)
select T.TopicID,
       T.ParentId,
       S.sumDebitIncludingChildren sumDebit,
       S.sumCreditIncludingChildren sumCredit
from T
  inner join (
             select RootID,
                    sum(sumDebit) as sumDebitIncludingChildren,
                    sum(sumCredit) as sumCreditIncludingChildren
             from C
             group by RootID
             ) as S
    on T.TopicID = S.RootID
order by T.TopicID
option (maxrecursion 0);

SQL Fiddle 中测试正常

【讨论】:

  • 你的代码工作但不够快,它在 8 秒内执行,但我当前的算法在 2 秒内执行
  • 如果我没记错的话,显示的查询只考虑父母和孩子,而不是孙子和更远的孩子。但是你,@franchesco totti,已经有一个有效的递归算法,它只需要 2 秒,但你认为这太慢了,需要更快的东西吗?
  • @Thorsten Kettner option (maxrecursion 0); 是的,sql 不擅长树结构计算,如果我们让 c# 承担其余部分可能会更好,或者改变表数据的实现?
  • @Pham X. Bach:是的,你是对的,CTE C 是递归的。对不起。
  • 昨天我也懒得分析你的查询。我很困惑你是如何得到你的结果的,因为这是我失败的地方。它表明您依赖作为 ParentId + 扩展的子 ID。如果不是这种情况,您将无法按所需顺序带来递归结果。这是应该指出的。好答案,无论如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多