2010-05-18 61 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