首页 新闻 会员 周边

Sql Server 中的计算列

0
悬赏园豆:50 [已解决问题] 解决于 2008-11-20 14:48

请问能不能在计算列中使用Sum()函数计算出另一个表中字段的合计

 

问题补充: 比如有以下两个表A和B, B.ParentId 的外键是A.Id,A.Num是计算列,我想在A.Num 列中写一个公式,自动得出B中所有ParentId=A.Id的Num字段的总和。 表A: Id Num 表B: Id ParentId Num
luotong的主页 luotong | 初学一级 | 园豆:4
提问于:2008-11-20 09:25
< >
分享
最佳答案
2

计算列不能引用其他表的列,但是可以通过函数来实现,先建立下面这个函数:
create function DingXue(@id int)
    returns int
as
begin
    declare @sum int
    select @sum=sum(num) from b where id=@id
    return @sum
end

然后创建表:
create table A(Id int identity(1,1), Num as dbo.DingXue(Id), tt int)
create table B(Id int identity(1,1), ParentId int, Num int)

测试如下:
insert into A(tt) values(1)
insert into B(ParentId,Num) values(1,1234)
insert into B(ParentId,Num) values(1,4321)
select * from A
select * from B

=================

A表里的tt只是为了增加A表里的记录 :)

======================

其实我一直觉得数据库里没有必要存放计算列,因为“计算”这种事情,让程序来做会更简单,非要数据库来做,也可以直接使用 select a.id, sum(b.num) as num from a inner join b on a.id=b.parentid 这种方式来实现

另外,也可以在B表加触发器来实现,介理相对于函数来说,我对触发器的抵触情绪更严重一些,呵呵,所以这里提供函数方式的实现

丁学 | 专家六级 |园豆:18730 | 2008-11-20 09:46
其他回答(5)
0

可以啊。你的问题是什么?  

West | 园豆:1095 (小虾三级) | 2008-11-20 09:35
0

update num =d.total  from  c inner join  (select a.aid, sum(b.num) as total from a inner join b on a.aid=b.aid group by a.aid) d on c.id = d.id

wind hong | 园豆:211 (菜鸟二级) | 2008-11-20 10:55
0

感觉计算列是不能跨表计算的,否则关联的那个表如果不存在了,计算列以什么依据来计算呢?

eaglet | 园豆:17139 (专家六级) | 2008-11-20 11:12
0

建议不要这样使用,如果你非要这样用,可以试着自己写一个自定义函数

玉开 | 园豆:8822 (大侠五级) | 2008-11-20 12:34
0

按我的理解,丁学写的就应该能够满足你的要求.但是你要自动的话,是不是可以考虑写成trigger.

PS:计算所得的列规范中有错误这个问题是什么原因造成的?是不是一对多的问题?

有所为,有所不为 | 园豆:1200 (小虾三级) | 2008-11-20 14:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册