Insérer dans la table SQL

J'essaie d'insert des numéros de facture d'une database à une autre. La nouvelle database, invoiceNo est la key primaire. Il y a des numéros de facture en double de la database originale. J'ai trouvé les duplicates en utilisant

SELECT SERIAL_NO, COUNT(*) as cnt FROM HISTORY_INCIDENTS group by SERIAL_NO having COUNT(*) > 1 order by COUNT(*) desc 

Je voudrais placer un -1 à la fin de la deuxième facture afin qu'ils soient uniques. Vous ne savez pas comment faire cela est SQL

Vous pouvez utiliser un CTE comme ça …

 ; WITH cteDups AS ( SELECT SERIAL_NO , RN = ROW_NUMBER() OVER ( PARTITION BY SERIAL_NO ORDER BY SERIAL_NO ) FROM HISTORY_INCIDENTS ) SELECT CASE RN WHEN 2 THEN SERIAL_NO + '-1' ELSE SERIAL_NO END AS SERIAL_NO FROM cteDups 

voir le violon . Cela crée un numéro de ligne de 2 lorsqu'il y a un doublon, vous pouvez alors utiliser un CASE pour vérifier les 2 , et affecter le -1 à cet logging.

EDIT : basé sur un commentaire

 DECLARE @HISTORY_INCIDENTS TABLE ( SERIAL_NO INT ); DECLARE @NewHISTORY_INCIDENTS TABLE ( SERIAL_NO VARCHAR(10) ); INSERT INTO @HISTORY_INCIDENTS ( SERIAL_NO ) VALUES ( 1 ); INSERT INTO @HISTORY_INCIDENTS ( SERIAL_NO ) VALUES ( 2 ); INSERT INTO @HISTORY_INCIDENTS ( SERIAL_NO ) VALUES ( 2 ); INSERT INTO @HISTORY_INCIDENTS ( SERIAL_NO ) VALUES ( 2 ); ; WITH cteDups AS ( SELECT SERIAL_NO , RN = ROW_NUMBER() OVER ( PARTITION BY SERIAL_NO ORDER BY SERIAL_NO ) FROM @HISTORY_INCIDENTS ) INSERT INTO @NewHISTORY_INCIDENTS ( SERIAL_NO ) SELECT CASE RN WHEN 2 THEN CAST(SERIAL_NO AS VARCHAR(10)) + '-1' ELSE CAST(SERIAL_NO AS VARCHAR(10)) END AS SERIAL_NO FROM cteDups SELECT SERIAL_NO FROM @NewHISTORY_INCIDENTS 

Je pense que cela fonctionnera.

J'ai utilisé la fonction ROW_NUMBER () pour calculer le nombre de fois qu'un numéro de série s'est produit dans une table dérivée interne. Dans la requête principale, je prends des décisions sur la façon d'élaborer le nouveau numéro de série en fonction du nombre d'occurrences que j'ai trouvées.

PS: fait sans un éditeur SQL.

 SELECT SERIAL_NO ,SERIAL_NO + CASE WHEN [SERIAL_NO_Occurrence] > 1 THEN '-' + CAST([SERIAL_NO_Occurrence]-1 AS VARCHAR) ELSE '' END AS [SERIAL_NO_New] FROM ( -- inner derived table to select number of occurrences of each serial number SELECT SERIAL_NO ,ROW_NUMBER() OVER ( PARTITION BY SERIAL_NO ORDER BY SERIAL_NO -- you should also have a PK field here to have deterministic results I think ) AS [SERIAL_NO_Occurrence] FROM HISTORY_INCIDENTS ) AS T1;