SQL Server Ajouter une colonne calculée avec la boucle WHILE

Je suis censé avoir une colonne qui met à jour automatiquement la dette de chaque membre, par an

L'ancienne dette était de 60 000 jusqu'à l'année 2013, après quoi elle est devenue 75 000

Il y a aussi une colonne "Activité" que j'utilise dans le programme, si le membre est toujours actif, il est réglé sur "OUI", s'il s'arrête, il est remplacé par "NON". Il y a aussi UNE AUTRE colonne appelée "pDebt". Dette

La formule de base derrière est un simple AmountOfDebt – PaidDebt (AKA @Amount – pDebt)

J'ai essayé de faire cette nouvelle table, mais j'avais 2 problèmes

  1. Les colonnes (l.7 "dateOfRegistration" & l.10 "Activity") continuent de donner le fameux "Nom de Colonne Invalide" tout en étant existant et déjà utilisé dans d'autres colonnes calculées

    PS: oui, j'ai utilisé Ctrl + Maj + R, j'ai sauvegardé la requête, redémarrer SQL Server plusieurs fois, ça se voit encore, donc je suppose qu'il y a un problème d'input

  2. Je ne peux pas connecter ma boucle WHILE à la fonction ADD pour append la nouvelle table.

Voici mon code,

Use [Project Alpha1] GO BEGIN DECLARE @Amount MONEY = 0, @IndividualYear int = YEAR([dateOfRegistration]) ALTER TABLE initialTable ADD fDebt1 AS (WHILE (@IndividualYear < GETDATE() AND [Activity] = 'YES') BEGIN IF @IndividualYear = 1998 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 1999 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2000 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2001 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2002 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2003 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2004 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2005 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2006 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2007 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2008 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2009 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2010 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2011 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2012 SET @Amount = @Amount + 60000 Else IF @IndividualYear = 2013 SET @Amount = @Amount + 60000 Else SET @Amount = @Amount + 75000 SET @IndividualYear = @IndividualYear + 1 END @Amount - pDebt) 

Je suis désolé, je sais que je n'ai pas tapé la fin du code correctement (la dernière ligne disant @Amount – pDebt), mais comme ma boucle WHILE ne fonctionnait pas, je ne pensais pas vraiment qu'il était nécessaire de travailler à travers jusqu'à la fin soit correctement

Ceci est fait sur SQL Server

Merci d'avoir lu les gars, j'apprécierais même la moindre aide.

Une méthode consiste à envelopper votre logique / calculs dans une fonction scalaire afin que votre champ calculé appelle simplement la fonction. Ce sera aussi plus facile à tester.

 ALTER TABLE initialTable ADD fDebt1 AS dbo.f_CalculateDebt([RegistrationDate], [Activity], [Debt]) 

Votre fonction scalaire pourrait alors ressembler à ceci:

 CREATE FUNCTION f_CalculateDebt( @RegistrationDate DATETIME, @Activity NVARCHAR(100), @Debt MONEY ) RETURNS MONEY AS BEGIN DECLARE @Amount MONEY = 0, @IndividualYear INT = YEAR(@RegistrationDate) WHILE (@IndividualYear < YEAR(GETDATE()) AND @Activity = 'YES') BEGIN IF @IndividualYear = 1998 SET @Amount = @Amount + 60000 -- Removed for readability -- ELSE IF @IndividualYear = 2013 SET @Amount = @Amount + 60000 ELSE SET @Amount = @Amount + 75000 SET @IndividualYear = @IndividualYear + 1 END RETURN @Amount - @Debt END GO