2010-05-18 2 views
1

Предположим, что у меня есть таблица amountInfo со столбцами (id, amount1, amount2, amount3) где amountX - это денежные значения, а id - значение int от 1 до некоторого int менее 10.Факторинг цикла while в сценарии SQL

в настоящее время у меня есть некоторый код, который делает это примерно:

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 

есть ли способ вынесет в то время цикла с каким-то сложным отборным заявлением здесь? Я имею опыт программирования C/C++/C#, но SQL для меня совершенно новый. Благодаря!

EDIT: в основном часть «-do something» включает в себя вставку отдельных элементов @amount в другую таблицу. Фактический запрос, который я запускаю, более сложный, чем это, но я надеюсь сначала решить эту простую проблему перед публикацией огромного примера кода.

+2

У меня есть идея, но я обеспокоен тем, что будет обусловлено то, что * сделать что-то с @ amounttotal * это ... Вы можете уточнить это? –

+0

Я согласен с Остином ... то, что вы пытаетесь сделать, приведет к тому, что ответ на ваш вопрос. Если вы пытаетесь обновить или вставить другие записи, вам, вероятно, просто нужно будет использовать подзапрос. Кроме того, ID будет соответствовать ряду строк или всего лишь 1 строке? –

ответ

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

Это выглядит хорошо, но не должно сравниваться в где: «id> = @ id И id <@idmax»? – Garett

+1

@Garett: исходный цикл while был <=, поэтому я думаю, что это правильно в предложении where. Будучи разборчивым, я бы взял «, ...» из ответа, поскольку он не соответствует выбранному. В противном случае, все еще давая ему +1, выглядит правильная идея. –

+0

@Jim. Да, ты прав. Я заметил, что в инструкциях сказано «от 1 до некоторого int до 10», но я не обращал внимания на исходный цикл. – Garett

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 и т. Д. ??? Этот ответ явно не то, что делает оригинальный цикл. BTW, хорошая новая картинка, вам могут потребоваться более высокие ботинки, хотя ;-) –

+0

@KM, Right Мне нужны отдельные итоги из каждой строки, получение всей суммы не то, что я хочу – Rich

Смежные вопросы