• 全部
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

高分寻求算法!!!!!!

andyfing 2002-05-10 06:01:15
SQL SERVER数据库
字段如下:
ID 上级ID 点数 假设值有10多万,例数据如下
……
1 0 78
2 1 60
3 1 61
4 1 60
5 3 45
6 2 45
7 3 40
8 2 30
8 2 40
……
如此类推,类似一个树形结构
现在我要算每一ID和属于他的ID的差点数之和即

ID=2
差点数=(60-45)+(60-30)+(60-40)
当数据很多时,该如何做最好?
...全文
31 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
andyfing 2002-05-15
是呀,
1。现在又加了一个,求本节点与次级从属点数差
2。假设某一个节点取消,他的从属节点怎么算的问题
3。加了一个等级字段,当符合某条件的时候,则升级,(我想用触发器解决)
回复
andyfing 2002-05-15
是呀,
1。现在又加了一个,求本节点与次级从属点数差
2。假设某一个节点取消,他的从属节点怎么算的问题
3。加了一个等级字段,当符合某条件的时候,则升级,(我想用触发器解决)
回复
ihihonline 2002-05-15
这个问题还没有解决?
回复
andyfing 2002-05-15
我不仅 要他的直接从属,并且需要,次级从属
用with cube怎么样呢?
回复
ihihonline 2002-05-15
1:好办,按上边的方法也可以将其做出;
2:是一个反查的过程,现保存,求值、删除;
3:升级如何理解啊?
回复
ihihonline 2002-05-15
1:好办,按上边的方法也可以将其做出;
2:是一个反查的过程,现保存,求值、删除;
3:升级如何理解啊?
回复
llsyhy 2002-05-15
我没有看懂你的问题怎么帮你呀!
回复
andyfing 2002-05-15
所有的操作都是对整个表操作!!
回复
riddler 2002-05-11
关注
回复
Cipherliu 2002-05-11
我在delphi中做过类似的树操作,首先要解决遍历的问题,我是用队列数据结构实现的。
1.搜索上级ID为0的记录(第一级节点),进入队列。
2.队头出队,同时搜索队头的所有直接下级进入队列。
3.重复步骤2,直至队空。

队列在Delphi中实现可以借助于TList,或TStringList也可以。

这种算法的好处在于可以快速遍历,而且对你的数据库中记录的顺序问题没有要求。子节点的ID可以小于父节点的ID。

回复
erp2 2002-05-11
SEE
回复
ihihonline 2002-05-11
//上边最后一句没有用处,不好意思
回复
ihihonline 2002-05-11
在delphi中,如果是查到一个ID时,对本ID进行操作,可以:

with query1 do
begin
close;
sql.clear;
sql.add('select * from youtable');
first;
combobox1.clear;
with combobox1.items do
begin
wile not (qeury1.eof) do
begin
add(fieldbyname('id').asstring);
next;
end;
end;
end;

=====================关键====================
combobox1onchange
begin
with query1 do
begin
close;
sql.clear;
sql.add('select 点数 from youtable where ID = :ID');
parambyname('ID').asstring(asInteger):=combobox1.text(Strtoint(combobox1.text));
open;
end;
with query2 do
begin
close;
sql.clear;
sql.add('select 点数 from youtable where 上级ID = :value ');
parambyname('上级ID').asstring(asInteger) :=combobox1.text;
open;
end;
end;

计算:
begin
result := 0;
query2.first;
with query2 do
beign
while not (query2.eof) do
begin
result := result + (query1.fieldbyname('点数').asfloat-fieldbyname('点数').asfloat);
Next;
end;
end;
//你自己试一下,我没有数据,也无法调式;
result := query1.fieldbyname('点数')
回复
firetoucher 2002-05-11
用存储过程返回记录集啊
回复
ihihonline 2002-05-11
其实你可以通过建临时表;
要以吧问题进行简化;
想问你一点,你所有的这一切是想在sql server里执行还是在delphi 的程序员执行?是一起执行还是查到某个id时,执行某个id?有没有返回结果的那个字段
等……
回复
andyfing 2002-05-11
这样的树形结构,在DEPHI里我该怎样操作呢?用什么控件?怎么用?
如能详细帮我的请
QQ:7207002
回复
andyfing 2002-05-11
各位请到相关帖子接分,
本贴暂不结分,请见谅,我还有相关问题请教。
只要回答,即加分,
并请,答案雷同不必重复
谢谢
回复
renzhm 2002-05-10
select 差和=(点数*(select count(上级ID) fro db where 上级ID=a.ID)-
(select sum(点数) from db where 上级ID=a.ID))
from db a
group by a.ID
回复
短歌如风 2002-05-10
只统计直接从属的节点吗?
Select ID, Sum(PointSub)
From
(Select PrimTab.ID as ID,PrimTab.点数-SecTab.点数 as PointSub
from MyTab PrimTab,MyTab SecTab
Where PrimTab.ID = SecTab.上级ID
)
//Where ID = 2
Group By ID
建议把子查询先写成一个视图。


____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/
回复
Cipherliu 2002-05-10
我用了好长时间帮你调出了一个算法,用一句话实现你的要求。
假设你的表名为TreeNodes,先增加一个字段“点数差”,然后执行下面的SQL语句
update treenodes set 点数差=
(select count(*) from Treenodes Q where Q.上级ID=treenodes.ID)*点数-
(select Sum(点数) from Treenodes P where P.上级ID=treenodes.ID group by 上级ID )

朋友,多给点分吧!
回复
加载更多回复
相关推荐
发帖
Delphi
创建于2007-08-02

4891

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2002-05-10 06:01
社区公告
暂无公告