7
votes

Renommer des lignes en double

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: xxx pré>

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


0 commentaires

5 Réponses :


1
votes
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

3 commentaires

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é.



16
votes
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

4 commentaires

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 . De plus, vous pouvez filtrer sur rnk> 1 bien que j'ai écrit la requête de telle sorte que les rangées où la RNK = 1 ne soit pas affectée.



0
votes

Il n'y a pas besoin de faire un update du tout. Ce qui suit créera la table pour insérer comme désiré xxx


0 commentaires

6
votes

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


0 commentaires

0
votes

Voici une instruction de mise à jour encore plus simple: xxx


1 commentaires

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."