一个闹心的问题

cuishijie869335 2004-04-03 03:26:07
现在又三个表:
1:存款表
——————————————————————————————
A_account 存款金额
0001 1000
0001 2000
0002 1000
0001 1000
0003 .
. .
. .

——————————————————————————————

2:取款表
————————————————————————-----————
A_account 取款金额
0001 100
0001 200
0002 100
0001 100
0003 .
. .
. .
_______________________________________________________________

3:储户信息表
——————————————————————-——————————
A_account 余额
0001 100
0001 200
0002 100
0001 100
0003 .
. .
. .
——————————————————————————————
我想要实现的功能是:
储户信息表中,A_account字段是唯一的,即同一个账号只能有一条纪录,而“存款表“和“取款表“中同一个表中有多条纪录,现在想把储户信息表中“余额”字段的值始终保持是“sum(存款表.存款金额)-sum(取款表.取款金额)where 储户信息表.A_account=存款表.A_account=取款表.A_account”。而且“储户信息表“中“余额”字段的值是随着“存款表”和“取款表”的更新而自动更新的,如何实现这种更能?谢谢!急!
...全文
51 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengan 2004-04-06
  • 打赏
  • 举报
回复
在企业管理器可以看见你创建的函数,请问我应该在哪里看到函数的原代码?
tinghuyang 2004-04-06
  • 打赏
  • 举报
回复
up
jiangchuandong 2004-04-05
  • 打赏
  • 举报
回复
你在企业管理器可以看见你创建的函数
zjcxc 2004-04-05
  • 打赏
  • 举报
回复
楼主是开玩笑,还是不会结帖?

结帖是点管理--给分
cuishijie869335 2004-04-05
  • 打赏
  • 举报
回复
本贴已结:zjcxc(: 邹建 :) 10分
WGYKING 2004-04-05
  • 打赏
  • 举报
回复
M
quansui 2004-04-03
  • 打赏
  • 举报
回复
关注。又学一着
wdsimon 2004-04-03
  • 打赏
  • 举报
回复
厉害还不结贴给分,还等什么? :)
wdsimon 2004-04-03
  • 打赏
  • 举报
回复
厉害还不接贴,还等什么? :)
cuishijie869335 2004-04-03
  • 打赏
  • 举报
回复
太感谢了!厉害!
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
那个函数是SQL的自定义函数,在查询分析器中执行创建函数的代码(就是上面的来创建)
cuishijie869335 2004-04-03
  • 打赏
  • 举报
回复
再劳驾一下:我不光是为了查询,而是要实现软件的长久功能,你编的函数应该放在SQL server的什么地方?
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
所以你打开表看到的余额始终是最新的.
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
我那个不是存储过程,是自定义公式,在你查询数据的时候,它会自动重算.
cuishijie869335 2004-04-03
  • 打赏
  • 举报
回复
这个存储过程是什么时候执行呢?是随时自动更新吗?
cuishijie869335 2004-04-03
  • 打赏
  • 举报
回复
非常感谢!!!!
klan 2004-04-03
  • 打赏
  • 举报
回复
try:

create view v_储户信息表
as
select a.a_count A_account, (a.sum存款金额-isnull(b.sum取款金额,0)) 余额
from (select a_count,sum(存款金额) sum存款金额 from 存款表 group by a_count)a
left join (select a_count,sum(取款金额) sum取款金额 from 取款表 group by a_count)b
on a.a_count=b.a_count

go


用的时候就取:
selete * from v_储户信息表
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
--测试

--进行计算的函数
create function f_calc(@A_account char(4))
returns int
as
begin
return(isnull((
select sum(存款金额) from 存款表
where A_account=@A_account
),0)-isnull((
select sum(取款金额) from 取款表
where A_account=@A_account
),0))
end
go

--测试表
create table 存款表(A_account char(4),存款金额 int)
create table 取款表(A_account char(4),取款金额 int)
create table 储户信息表(A_account char(4),余额 as dbo.f_calc(A_account))
go

--测试数据
insert 储户信息表(A_account)
select '0001'
union all select '0002'
union all select '0003'
union all select '0004'

insert 存款表
select '0001',1000
union all select '0001',2000
union all select '0002',1000
union all select '0001',1000
union all select '0003',4000

insert 取款表
select '0001',100
union all select '0001',200
union all select '0002',100
union all select '0001',100
union all select '0003',3000
go

--显示结果
select * from 储户信息表
go

--删除测试
drop table 储户信息表,存款表,取款表
drop function f_calc

/*--测试结果
A_account 余额
--------- -----------
0001 3600
0002 900
0003 1000
0004 0

(所影响的行数为 4 行)
--*/
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
然后将余额字段的公式设置成:dbo.f_calc(A_account)
就可以实现你的要求了.
zjcxc 2004-04-03
  • 打赏
  • 举报
回复
--创建一个计算的函数
create function f_calc(@A_account char(4))
returns int
as
begin
return(isnull((
select sum(存款金额) from 存款表
where A_account=@A_account
),0)-isnull((
select sum(取款金额) from 取款表
where A_account=@A_account
),0))
end
go

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧