Incrémenter une valeur en fonction d'une condition

J'ai le problème suivant …

J'ai une table AccountingEntry qui a actuellement une key primaire, qui est l' ID comptabilité. J'ai aussi une colonne qui me dit quel type d'input c'est …

Ce que je dois faire est le suivant …

Si la ligne est d'un certain type (disons CreditCardPayment , j'ai besoin d'incrémenter la valeur d'une autre colonne, disons CCId par un … Comment puis-je accomplir cela?

(Juste un heads-up, pas de séparation de table peut être fait)

Cela doit être fait dans la déclaration INSERT ….

Disons dans ma database que j'ai ..

ID | TYPE | UN AUTRE ID
1 | DÉBIT | –
2 | CREDIT | 1
3 | DÉBIT | –
4 | CREDIT | x -> Cela doit être le dernier crédit 'AnotherID' + 1

Une simple mise à jour avec la condition WHERE devrait faire l'affaire ici:

 UPDATE TableName SET CCId = CCId + 1 WHERE Type = 'CreditCardPayment' 

Mettre à jour

Vous pouvez le faire automatiquement après l'instruction INSERT utilisant sortinggger:

 CREATE TRIGGER autoIncrement ON TableName AFTER INSERT AS UPDATE TableName SET CCId = -- put your 'get last of that type + 1 here WHERE Type = 'CreditCardPayment' AND Id = inserted.Id GO 

-- put your 'get last of that type + 1 here peut être quelque chose comme:

 SELECT TOP(1) AnotherID FROM TableName WHERE Type = 'CreditCardPayment' ORDER BY AnotherID DESC 

Si vous souhaitez exécuter une instance unique, vous pouvez utiliser la fonction Row_Number ().

 select rowtype, accountingid, ROW_NUMBER() over(partition by rowtype order by rowtype, accountingid) 

Cela vous obtiendra un numéro de ligne unique pour chaque rowtype commandé par accountingid. Ensuite, si vous avez besoin de ces informations dans la database, vous pouvez exécuter une mise à jour avec le select ou placer les lignes sélectionnées dans une table temporaire et mettre à jour de cette façon.

C'est le Trigger résultant … Fonctionne parfaitement pour ce dont j'avais besoin. Après avoir exécuté un script pour modifier datatables dans ma database que j'avais jusqu'à maintenant, chaque fois qu'un logging est inséré, s'il est du type dont j'avais besoin, il va auto-incrémenter le champ InvoiceNumber.

 CREATE TRIGGER IncrementInvoiceNumber ON AccountingEntry AFTER INSERT AS BEGIN DECLARE @insertedId INT; SELECT TOP(1) @insertedId = IdAccountingEntry FROM AccountingEntry ORDER BY IdAccountingEntry DESC; UPDATE AccountingEntry SET InvoiceNumber = ( SELECT TOP(1) InvoiceNumber FROM AccountingEntry WHERE AccountEntryType = 'I' ORDER BY InvoiceNumber DESC ) + 1 WHERE IdAccountingEntry = @insertedId; END