Voici un exemple simplifié de mon problème. J'ai une table où il y a une colonne "Nom" avec des entrées en double: faisant un groupe par comme Sélectionnez le nom, le compte (*) en tant que [Nombre] de groupe de tableau par nom CODE> Résultats dans ce: P>
SELECT * FROM Table AS T1
WHERE EXISTS (
SELECT Name, COUNT(*) AS [Count]
FROM Table
GROUP BY Name
HAVING (COUNT(*) > 1) AND (Name = T1.Name))
ORDER BY Name
5 Réponses :
DECLARE @Pointer VARCHAR(20), @Count INT WHILE EXISTS(SELECT Name FROM Table GROUP BY Name HAVING COUNT(1) > 1) BEGIN SELECT TOP 1 @Pointer = Name, @Count = COUNT(1) FROM Table GROUP BY Name HAVING COUNT(1) > 1 UPDATE TOP (1) TABLE SET Name = Name + '(' + @Count + ')' WHERE Name = @Pointer END
Désolé, je vais par la mémoire. Je n'ai pas de SSM sur mon ordinateur portable. Vous pouvez envelopper le nom concaténé dans un cas pour supprimer le premier (1).
Exellent, ça marche! Il suffit d'ajouter une fonte pour le numéro de ligne et le cas comme vous l'avez suggéré.
Merci et désolé d'avoir oublié le casting. Si j'avais installé SSMS ici, je l'aurais testé.
With Dups As ( Select Id, Name , Row_Number() Over ( Partition By Name Order By Id ) As Rnk From Table ) Update Table Set Name = T.Name + Case When D.Rnk > 1 Then ' (' + Cast(D.Rnk As varchar(10)) + ')' Else '' End From Table As T Join Dups As D On D.Id = T.Id
Je creuse les CTES. J'aurais aimé les utiliser plus souvent.
@Jakob gade- Avez-vous une erreur ou ne produit-il pas les résultats que vous voulez?
Je pense que je l'ai travaillé maintenant. Je devais juste comprendre comment remplacer le "de la table" avec la requête que j'ai pour la sélection des lignes que je veux modifier. :)
@Jakob Gade - Correct. C'est vraiment de code>. De plus, vous pouvez filtrer sur
rnk> 1 code> bien que j'ai écrit la requête de telle sorte que les rangées où la RNK = 1 ne soit pas affectée.
Il n'y a pas besoin de faire un update code> du tout. Ce qui suit créera la table pour
insérer code> comme désiré
Il suffit de mettre à jour la sous-requête directement:
update d set Name = Name+'('+cast(r as varchar(10))+')' from ( select Name, row_number() over (partition by Name order by Name) as r from [table] ) d where r > 1
Voici une instruction de mise à jour encore plus simple:
Merci. Mais je l'ai essayé, mais je ne peux pas le faire travailler. Message d'erreur indique "Les fonctions fenêtres ne peuvent apparaître que dans la sélection ou la commande par clauses."