2010-05-18 60 views
1

假设我有一个表amountInfo,其中的列(id,amount1,amount2,amount3) 其中amountX是货币值,id是int值,范围从1到10以下的一些int。因式分解SQL脚本中的while循环

目前,我有一些代码,大约做到这一点:

declare @id int, @idmax int, @amounttotal money 
select @idmax = (select max(Id) from amountInfo) 
while (@id <= @idmax) 
begin 
    select @amounttotal = sum(amount1 + amount2 + amount3) 
          from amountinfo where [email protected] 
    -- do something with @amounttotal 
    select @[email protected]+1 
end 

有没有办法分解出具有某种这里复杂的select语句的while循环?我对C/C++/C#编程有经验,但SQL对我来说还是一个新手。谢谢!

编辑:基本上“ - 做某事”部分涉及插入个人@amounttotals到另一个表。我正在运行的实际查询比这更复杂,但我希望在发布一个巨大的代码示例之前先解决这个简单的问题。

+2

我有一个想法,但我担心它会在什么*做点什么@ amounttotal *是......你能阐述一下它的条件? – 2010-05-18 18:39:40

+0

我同意奥斯汀......你试图做的事会驱动你的问题的答案是什么。如果您尝试更新或插入其他记录,则可能只需使用子查询。另外,ID是否对应于多行,或者只是总是1行? – 2010-05-18 18:45:46

回答

5

尝试这样的事:

INSERT INTO OtherTable 
     (id, col1, col2, ...) 
    SELECT 
     dt.id, t.col1, dt.TotalSum 
     FROM (SELECT 
        id, SUM(t.amount1 + t.amount2 + t.amount3) AS TotalSum 
        FROM AMOUNTINFO 
        GROUP BY id 
        WHERE id>[email protected] AND id<[email protected] 
      ) dt 
      INNER JOIN AMOUNTINFO t ON dt.id=t.id 
+0

这看起来不错,但不应该比较where子句是“id> = @ id和id <@idmax”? – Garett 2010-05-18 19:31:35

+1

@Garett:最初的while循环有<=所以我认为在where子句中是正确的。因为挑剔,我会把答案拿出来,因为它不符合选择。否则,仍然给它+1,看起来是正确的想法。 – 2010-05-18 19:38:47

+0

@Jim。你是对的。我注意到指令说“范围从1到10以下的一些int”,但我没有注意到原来的循环。 – Garett 2010-05-18 19:42:11

1

你不需要while循环使用:

SELECT @amounttotal = SUM(t.amount1 + t.amount2 + t.amount3) 
    FROM AMOUNTINFO t 
WHERE t.id BETWEEN @id AND @idmax 

...但你需要描述你在while循环做给@amounttotal变量什么为我们进一步帮助你。

+0

但是这个地址如何处理' - 用@ amounttotal'做些什么? “做某事”可能只是任何事情:调用存储过程,UPDATE tableX等。这个答案显然不是原始循环所做的。顺便说一句,不错的新图片,虽然你可能需要更高的靴子;-) – 2010-05-18 18:46:19

+0

@KM,右我需要每行的个人总数,得到的总和不是我想要的 – Rich 2010-05-18 18:49:23