Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用最快算法计算资产负债表_Sql_Performance_Tree_Sql Server 2008 R2 - Fatal编程技术网

Sql 用最快算法计算资产负债表

Sql 用最快算法计算资产负债表,sql,performance,tree,sql-server-2008-r2,Sql,Performance,Tree,Sql Server 2008 R2,我正在使用会计软件 在计算分层自引用主题的资产负债表时,请告诉我最快的算法 这些是我的桌子: 主题表格: TopicID nvarchar(50) -- is Parent Field ParentID nvarchar(50) -- is Child Field Description nvarchar(512) ------------DocumentDetal table DocumentNumber nvarchar(50) TopicFK nvarchar(50) Debit d

我正在使用会计软件

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

这些是我的桌子:

主题表格:

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)
两个表与
TopicID
TopicFK
列相关,请告诉我如何使用SQL存储过程计算资产负债表

以下是数据示例:

以下是文件:

实际上我想要以下的计算结果:


对于您的
SQL Server 2008 R2
,这里是针对
sumDebit和sumCredit
。不知道如何计算
Res借方和Res贷方
,但我认为您也可以编辑以获得您的
Res值

无论如何,这是在使用
CTE
感谢
Mikael Eriksson
in


中测试合格这里的一些成员可能擅长算法,但不擅长会计。那么,您能解释一下,从您的表格中计算资产负债表的逻辑吗?示例数据和预期输出更好。这是用于哪个RDBMS的?请添加一个标记来指定您使用的是
mysql
postgresql
sql server
oracle
还是
db2
——或者完全是其他什么。提供了@PhamX.Bach外部信息,请提供这方面的帮助。您的意思是把c#和sql server放在一起,让我们编写一些c#代码,还是sql?你写了一些关于过程的东西,但是c#标记有点misleading@JakubSzumiato我想编写sql存储过程,并在c#中使用该过程,但我的问题只是sql。您的代码工作正常,但速度不够快,它在8秒内执行,但我当前的算法在2秒内执行如果我没有弄错,所显示的查询只考虑父项和子项,而不考虑孙子和其他。但是你,“PraveSto-TTTI”已经有一个工作递归算法,它只需要2秒,但是你认为这太慢了,需要更快的东西吗?@ Thorsten Kettner <代码>选项(Max递归0);
是的,sql不擅长树结构计算,如果我们让c#来做其余的,或者改变表数据的实现,可能会更好?@Pham X.Bach:是的,你是对的,CTE c是递归的。对不起,昨天我也懒得分析你的问题。我很困惑你是如何得到你的结果的,因为这就是我失败的地方。它表明您依赖于ParentId+扩展名的子ID。如果不是这样的话,您就不能按照所需的顺序生成递归结果。这是应该指出的。无论如何,回答得不错。
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);