我想咨询一件事。我在DB有桌子。它有2列,如下所示:
Name...bilance
Jane...+3
简.-5
简.0
简.-8
简,-2
保罗.-1
保罗.2
保罗.
保罗.1
..。
我必须遍历这个表,如果我发现记录具有不同的“名称”(与前一行相比),我将处理所有带有前一个"name“的行。(如果我踩到第一个Paul行,就会处理所有Jane行)
处理过程如下:
现在我只和简的唱片一起工作,一个接一个地浏览它们。在每一张唱片上,我都会停下来,把它和先前所有的简行逐一比较。
任务是在实际人员的范围内,如果他们有不同的标志,就把他们的“胆小”列命名为“虚张声势”。
摘要:
我并行地遍历这个表的三个级别(嵌套循环)
1级=搜索"name“列的更改
2级=如果发现更改,获取所有带有先前“名称”的行,然后遍历它们
第3层=在每一行上停止并遍历前面所有具有当前“名称”的行
可以只使用游标和抓取来解决这个问题,还是有一些更平滑的解决方案?
我的真正的表有30000行和1500人,如果我用PHP进行逻辑操作,它需要很长的时间和超时时间。因此,我想重写它到MS 2000 (不允许其他DB )。游标是快速解决方案还是使用其他东西更好?
谢谢你的意见。
更新:
关于我的“总结”有很多问题。问题比我解释的要难一些。我简化了它,只是为了描述我的算法。
表的每一行都包含更多的列。最重要的是月份。这就是为什么每个人都有更多的行。每个月都是不同的月份。
“双语”指的是“加班”和“加班时间”。我需要用前几个月的值来中和它们。我想要尽可能多的零。所有的表都必须保持原样,只有两倍必须改为零。
示例:
行(Jane -5)将用行(Jane +3)进行总结。而不是3,我将得到0,而不是-5,我将得到-2。因为我用这个-5来减少+3。
下一行(简0)不会受到影响
下一行(Jane -8)不能使用,因为前面的所有两段都是负值。
等。
发布于 2011-02-21 17:26:26
可以使用单个SQL语句对每个名称的所有值进行求和:
select
name,
sum(bilance) as bilance_sum
from
my_table
group by
name
order by
name发布于 2011-02-21 17:27:31
从表面上看,这听起来应该是你想做的事:
select Name, sum(bilance)
from table
group by Name
order by Name如果不是,您可能需要详细说明名称是如何排序的,以及您所说的“汇总”指的是什么。
发布于 2011-02-21 17:28:36
我不知道你这句话是什么意思.“任务是在实际人员的范围内,如果他们有不同的标志,就把”胆小“一栏标出。
但是,可以按查询使用组来获取所需的大量内容。
select name, case when bilance < 0 then 'negative' when bilance >= 0 then 'positive', count(*)
from table
group by name, bilance这可能不是case语句的完美语法,但它应该会使您非常接近。
https://stackoverflow.com/questions/5069103
复制相似问题