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);