2

我有一张带有父子关系的会计科目表(层次模型)。该表携带两种类型的账户控制账户和交易账户。

交易账户有余额,但没有任何子账户。

控制账户没有自己的余额,但它们带有子账户。


帐号| 职位 |AccountType|ParentID| 平衡
---------|----|------------|--------|-- --------
 1 | 资产 | c | 空 | 空值
 1-1 | 流动资产 | c | 1 | 空值
 1-1-1 | 现金 | 吨 | 1-1 | 1000
 1-1-2 | 库存 | 吨 | 1-1 | 2000
 1-2 | 固定资产 | c | 1 | 空值
 1-2-1 | 家具 | 吨 | 1-2 | 1500
 1-2-2 | 建筑 | 吨 | 1-2 | 3000

我需要一个结果集,例如:


帐号| 职位 |AccountType|ParentID| 平衡
---------|----|------------|--------|-- --------
 1 | 资产 | c | 空 | 7500 --流动资产和固定资产的总和
 1-1 | 流动资产 | c | 1 | 3000 --现金和库存的总和
 1-1-1 | 现金 | 吨 | 1-1 | 1000
 1-1-2 | 库存 | 吨 | 1-1 | 2000
 1-2 | 固定资产 | c | 1 | 4500——家具和建筑的总和
 1-2-1 | 家具 | 吨 | 1-2 | 1500
 1-2-2 | 建筑 | 吨 | 1-2 | 3000

事务表


ID |AccountID|金额
---|----------|------
 1 | 1-1-1 | 300  
 2 | 1-1-1 | 700
 3 | 1-1-2 | 1500
 4 | 1-1-2 | 500
 5 | 1-2-1 | 700
 6 | 1-2-1 | 800
 7 | 1-2-2 | 2000
 8 | 1-2-2 | 1000

如果可能,任何选择语句或函数或存储过程。

任何帮助将不胜感激

4

2 回答 2

2

方法 1(感谢 asantaballa 将我的注意力转移到 CTE 上)

With TrialBalance(AccountID, ParentID, Balance)
AS
(
Select AccountId, ParentID, Balance From Accounts Where AccountType = 't'
Union All
Select A.AccountId, A.ParentID, T.Balance From Accounts A
Inner Join TrialBalance T On A.AccountId = T.ParentID
)
Select AccountID, SUM(Balance) From TrialBalance Group By AccountID    

方法二

Create Function AccountBalance(@AccountID Nvarchar(100))
Returns Float
AS
Begin
Declare @Balance Float
Select @Balance = Balance From Accounts Where AccountID = @AccountID
Select @Balance += Sum(dbo.AccountBalance(AccountID)) From Accounts
Where ParentID = @AccountID
Return @Balance
End

Select AccountID, dbo.AccountBalance(AccountID) From Accounts

以上两种方法都返回所需的结果。

于 2013-11-02T18:29:40.593 回答
0

有很多方法可以做到这一点,但是我用几个更新语句做到了。请注意,您没有提供任何数据库结构,所以我想您有 2 个表 - 一个带有帐户,另一个带有交易帐户的余额:

create table #accounts (
AccountId int
,Title varchar(60)
,AccountType varchar(10)
,ParentID int
,Balance int
)
create table #transactional_accounts (
Id int
,AccountID int
,Amount int
)

insert into #accounts (AccountId, Title, AccountType,ParentID) values
..............
insert into #transactional_accounts values
........... 

 update #accounts
 set Balance= (select SUM(amount) from #transactional_accounts t2 where t1.AccountId= t2.AccountID  )
from #accounts t1
where AccountType ='t'


update #accounts
set Balance= case when t1.ParentID is not null then (select SUM(t2.Balance) from #accounts t2 where t1.AccountId=t2.ParentID)
          else (select SUM(t2.Balance) from #accounts t2)
          end
from #accounts t1
where AccountType ='c'

select * from #accounts
于 2013-11-01T09:38:04.187 回答