2016-06-29 2 views
2

Première fois sur le site alors mes excuses pour tout manque de clarté ou l'échec de trouver une solution par moi-même!Remplir une colonne avec des valeurs calculées à partir d'une autre colonne dans T-SQL

J'ai une table temporaire (# Temptable3) que je remplis pour aider à construire un ensemble de données à partir duquel faire un rapport. J'ai résolu la plupart des étapes logiques à travers un peu d'essais et d'erreurs et de trouver des réponses aux questions précédentes ici (merci!) Mais ne peut pas casser ce dernier morceau. Pour simplifier, j'ai supprimé les colonnes non pertinentes à partir d'un ensemble de données exemple ci-dessous:

J'ai actuellement:

RowNumber Increment Score 
----------------------------- 
    1    1  NULL 
    2  100000  NULL 
    3   -1  NULL 
    4    1  NULL 
    5   10  NULL 
    6   -1  NULL 
    7  -100000  NULL 
    8   -10  NULL 

Ce que je vise à obtenir est la colonne de score pour remplir avec la somme de la colonne Incrémenter jusqu'à et y compris sa propre ligne, par exemple:

RowNumber Increment Score 
----------------------------- 
    1   1   1 
    2  100000  100001 
    3   -1  100000 
    4   1  100001 
    5   10  100011 
    6   -1  100010 
    7 -100000   10 
    8  -10   0 

J'ai essayé et échoué à obtenir une mise à jour de diverses déclarations au travail, en jouant avec auto-jointures, mais ne trouve rien qui semble prometteur. Toutes mes excuses si cela ne suffit pas. S'il vous plaît poser des questions si nécessaire Merci pour toute aide.

Merci à HABO pour le pointeur pour m'aider à trouver des questions sur les sommes de fonctionnement. Un lien dans janderssons reply à une question précédente me conduire à une solution qui a fonctionné pour moi:

@runningtotal int déclarer ensemble @runningtotal = 0

mise à jour # TempTable3 set @runningtotal = Score = @runningtotal + incrément

de # TempTable3

+0

Ce que vous cherchez s'appelle un _running sum_.Essayez un peu plus de recherche, par ex. '[tsql] somme en cours'. – HABO

Répondre

2

Quelque chose comme:

SELECT [RowNumber], Increment 
     , SUM(Increment) OVER(ORDER BY [RowNumber]) AS Score 
FROM Your_Table 

Devrait faire l'affaire. Voir here.

Pour les futurs lecteurs: Apparemment, la syntaxe over est disponible dans SQL Server 2012, mais pas le sum() over(). Pour une solution alternative (et une solution plus complète pour une mise à jour), voir la réponse de @JohnCappelletti.

+0

Vous êtes à la recherche d'un commentaire? – HoneyBadger

+0

IMHO - Un commentaire devrait être tenu de voter à la baisse - même s'il est resté anonyme –

+0

@JohnCappelletti Prenez-le à meta – Paparazzi

2
Declare @Table table (RowNumber int,Increment int,score int) 
Insert into @Table values 
(1,1,NULL), 
(2,100000,NULL), 
(3,-1,NULL), 
(4,1,NULL), 
(5,10,NULL), 
(6,-1,NULL), 
(7,-100000,NULL), 
(8,-10,NULL) 

Update @Table Set Score=B.Score 
From @Table A 
Join (Select RowNumber,Score=sum(Increment) over (order by RowNumber) from @Table) B 
    on A.RowNumber=B.RowNumber 

Select * from @Table 

OU

UPDATE @Table SET Score=(SELECT SUM(Increment) 
          FROM @Table B 
          WHERE b.RowNumber <= A.RowNumber) 
FROM @Table A 

Retours

RowNumber Increment  score 
    1   1   1 
    2   100000  100001 
    3   -1   100000 
    4   1   100001 
    5   10   100011 
    6   -1   100010 
    7   -100000  10 
    8   -10   0 
+0

Bonjour John - merci pour la réponse rapide, j'avais essayé votre solution ci-dessus, en substituant mon nom de table comme approprié mais j'ai reçu le message syntaxe proche de 'order'. "J'ai essayé de coller le vôtre dans une fenêtre de requête propre et j'ai couru tel quel et j'ai reçu le même message Pas sûr que c'est pertinent, je suis en T-SQL MS SQL SMS 2008 R2 –

+0

Quelle version de SQL 2008 +? –

+0

Il y a 3 @ Table de avez-vous fait tous les trois? –

1

Merci pour le pointeur de HABO me aider à trouver des questions précédentes sur les sommes en cours. Un lien dans janderssons reply à une question précédente me conduire à une solution qui a fonctionné pour moi:

@runningtotal int déclare @runningtotal = 0 mis

mise à jour # TempTable3 = Score @runningtotal définie = @runningtotal + incrément

de # TempTable3

Merci encore à HoneyBadger JohnCappelletti pour persévérer avec moi, je suis sûr que la faute était probablement la mienne.

+0

Sans spécifier un ordre explicite, SQL Server peut mettre à jour les lignes dans n'importe quel ordre. Une solution comme celle de John Cappeletti garantit que les sommes sont calculées en fonction des lignes correctes. Selon la version de SQL Server que vous utilisez, ['LAG'] (https://msdn.microsoft.com/en-us/library/hh231256.aspx?f=255&MSPPError=-2147217396) peut être utile. (Il est utile de marquer les questions de base de données avec le logiciel et la version, par exemple 'sql-server-2014'.) – HABO