我自己已经解决了,但估计高手们还有更好的解法。现在我有sqlserver2008表如下
CREATE TABLE [dbo].[tCursor](
[ID] [int] NOT NULL,
[Sum] [int] NULL
) ON [PRIMARY]
然后用循环添加id,1-100,
declare @i int
set @i=1
while(@i <=100)
begin
insert into tCursor (ID) values(@i)
set @i=@i+1
end
然后,要达到的结果如下,
也就是某行的sum是某行以及之前所有id之和。求高手给出具体的sql代码,请测试后再发答案!
---------------
还有,解法必须有一定灵活性,主要体现在不能假设id列是具体的某些数字,他们只是任意的自然数。我上面写了1-100只是因为方便看结果是否正确。
你那个小于号是无法正确得到前面的行的吧,我上面说了不能假设已有id的大小或顺序。他们是随机自然数。
你那个小于号是无法正确得到前面的行的吧,我上面说了不能假设已有id的大小或顺序。他们是随机自然数。
追答既然你对ID列有“随机自然数”的要求,那ID就不能作为自增长的主键,记录的顺序就毫无意义。
想有顺序,就得另建一个自增的列作为主键(假设为PID),并将ID的值累加到SUM中,SQL语句如下:
select PID, ID,(select sum(ID) from tCursor b where b.PID<=a.PID) as SUM from tCursor a
结果:
你说的顺序无意义我只能同意一半,因为sqlserver就是按照插入的顺序来显示的,你有什么办法让那顺序混乱呢?
你上面只是一个select语句,没有update?
还有你那明明是excel,没测试过啊?
不能以你直接在数据库中看到的顺序为准。不同的数据库,对于不加order by的select的排序逻辑不同,尤其是表发生过删除、插入的情况下,默认排序经常会看起来是混乱的。所以最终你一定要按某种确定的order by的顺序在应用界面上呈现给用户,这是好的编程习惯,有利于程序跨数据库迁移。
上面的图片和语句,是在ACCESS中测试的,因为我电脑上没有sqlserver。
你可以看看附件中的原数据库文件。原表中只有PID和ID。查询结果中的SUM字段,是在查询过程中生成的。
但我提问明确了是sqlserver,你有什么办法让那顺序混乱呢?只能说还是谢谢你了。如果没有更好的答案就采纳你吧。
追答即便是在sqlserver中,这种没主键没索引的表,不加order by,是保证不了select的顺序的。现在就这几条记录,看似有序。等用上一段时间之后,数据一多,你就不知道优化器会怎么干活了。
给你看一篇旧文,说得比较清楚:
http://www.cftea.com/c/2009/04/YZNSRK1DWLTRR8GE.asp