MS SQL 2000 - 如何有效地遍历一组先前的记录并在组中处理它们。大桌子

时间:2011-02-21 17:22:51

标签: sql loops sql-server-2000 cursor nested

我想咨询一件事。我在DB中有表。它有2列,看起来像这样:

命名... bilance

...简+ 3个
简...- 5
简... 0
简...- 8
简...- 2
保罗...- 1个
保罗... 2
保罗.... 9
保罗...... 1个
...

我必须遍历此表,如果我找到具有不同“名称”的记录(比前一行上的记录),我将使用前一个“名称”处理所有行。 (如果我踩到第一个保罗行,我处理所有简行)

处理过程如下:

现在我只使用Jane记录并逐个浏览它们。在每条记录上,我停下来,逐一将它与所有以前的Jane行进行比较。

如果他们有不同的标志,任务是对“bilance”专栏(在实际人的范围内)进行总结

要点:

我在3个级别中循环遍历该表(嵌套循环)
第1级=搜索“名称”列的更改
第二级=如果找到了更改,请获取前一个“名称”的所有行并浏览它们 第3级=在每一行停止并使用当前“名称”

遍历所有之前的行

只能使用CURSOR和FETCHING解决这个问题,还是有一些更顺畅的解决方案?

我的真实表有30 000行和1500人。如果我在PHP中执行逻辑,则需要很长时间而不是超时。所以我想将它重写为MS SQL 2000(不允许其他数据库)。游标是快速解决方案还是使用其他东西更好?

感谢您的意见。

更新

关于我的“摘要”有很多问题。问题比我解释的要困难一些。我简化它只是为了描述我的算法。

我的表格的每一行都包含更多列。最重要的是月份。这就是每个人有更多行的原因。每个月都是不同的月份 “Bilances”是“工作加班”和“拖欠工作时间”的工人。我需要sumarize +和 - bilances来使用前几个月的值来中和它们。我希望尽可能多的零。所有表格必须保持原样,只需将双翼版本更改为零。

示例:

行(Jane -5)将用行(Jane +3)汇总。而不是3我会得到0而不是-5我会得-2。因为我用这个-5来减少+3 下一行(简0)不会受到影响 不能使用下一行(Jane -8),因为所有先前的双向都是负的 等

3 个答案:

答案 0 :(得分:0)

您可以使用单个SQL语句对每个名称的所有值进行求和:

select
    name,
    sum(bilance) as bilance_sum
from
    my_table
group by
    name
order by
    name

答案 1 :(得分:0)

从表面上看,听起来应该做你想做的事情:

select Name, sum(bilance)
from table
group by Name
order by Name

如果没有,您可能需要详细说明名称的排序方式以及“汇总”的含义。

答案 2 :(得分:0)

我不确定你对这条线的意思......“如果它们有不同的标志,那么任务就是使”bilance“栏目(在实际人的范围内)”。

但是,可以通过查询分组来获得您需要的大量内容。

select name, case when bilance < 0 then 'negative' when bilance >= 0 then 'positive', count(*)
from table
group by name, bilance

这可能不是case语句的完美语法,但它应该让你非常接近。