2010-05-18 5 views
1

Supposons que j'ai une table amountInfo avec des colonnes (id, amount1, amount2, amount3) où amountX sont des valeurs monétaires et id est une valeur int comprise entre 1 et un int inférieur à 10.Affacturage d'une boucle while dans le script SQL

Actuellement, j'ai un code qui fait à peu près ceci:

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 

est-il un moyen de prendre en compte la boucle while avec une sorte de complexe instruction select ici? Je suis expérimenté avec la programmation C/C++/C# mais SQL est un peu nouveau pour moi. Merci!

EDIT: fondamentalement, la partie "--do quelque chose" implique l'insertion de @amounttotals individuels dans une autre table. La requête actuelle que je cours est plus compliquée que cela mais j'espère résoudre ce problème simple avant de poster un énorme exemple de code.

+2

J'ai une idée mais je suis préoccupé par ce serait conditionnel à ce que * faire quelque chose avec @ amounttotal * est ... Pouvez-vous élaborer là-dessus? –

+0

Je suis d'accord avec Austin ... ce que vous essayez de faire va conduire la réponse à votre question. Si vous essayez de mettre à jour ou d'insérer d'autres enregistrements, vous avez probablement besoin d'utiliser une sous-requête. Aussi, l'ID va-t-il correspondre à un nombre de lignes, ou juste à 1 rangée? –

Répondre

5

essayer quelque chose comme ceci:

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

Cela semble bon, mais ne devrait pas la comparaison dans la clause where est "id> = @ id AND id <@idmax"? – Garett

+1

@Garett: La boucle while originale avait <= alors je pense que c'est dans la clause where. Étant pointilleux, je prendrais le ', ...' hors de la réponse car il ne correspond pas au select. Sinon, en lui donnant +1, ressemble à la bonne idée. –

+0

@Jim. Oui tu as raison. J'ai remarqué que les instructions disaient "allant de 1 à certains int sous 10", mais je n'ai pas fait attention à la boucle d'origine. – Garett

1

Vous n'avez pas besoin de la boucle while, utilisez:

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

... mais vous devez décrire ce que vous faites dans la boucle while à la variable @amounttotal pour nous de vous aider.

+0

mais comment cette adresse '- faire quelque chose avec @ amounttotal' ?? Le "faire quelque chose" pourrait être à peu près tout: appeler une procédure stockée, UPDATE tableX, etc ??? Cette réponse n'est clairement pas ce que fait la boucle originale. BTW, belle nouvelle image, vous pourriez avoir besoin de plus grandes bottes ;-) –

+0

@KM, droit J'ai besoin des totaux individuels de chaque rangée, obtenir la totalité de la somme n'est pas ce que je veux – Rich

Questions connexes