Question

J'ai une table dans SQL Server 2000 avec des données similaires au suivant:

ReferenceNumber    ReferenceValue
00001              Not assigned
00002              Not assigned
00002              ABCDE

dans lequel chaque numéro de référence peut apparaître plusieurs fois dans la table, avec une valeur de référence de 'Non attribué' ou une valeur de référence vraie.

Je souhaite transférer les données dans une table nettoyée comportant une seule ligne par numéro de référence et une valeur de référence réelle si elle existe, ou "Non affecté" s'il n'y a pas de valeur de référence réelle.

Je peux voir comment procéder avec deux requêtes:

SELECT TOP 1 ReferenceNumber, ReferenceValue
INTO clean
FROM duplicates
WHERE ReferenceValue <> 'Not assigned'

INSERT INTO clean(ReferenceNumber, ReferenceValue)
SELECT TOP 1 ReferenceNumber, ReferenceValue
WHERE ReferenceValue = 'Not assigned' 
AND ReferenceNumber NOT IN (SELECT ReferenceNumber FROM clean)

mais je pense qu'il doit y avoir un meilleur moyen. Des idées?

Était-ce utile?

La solution

Quelque chose comme ça:

SELECT 
  ReferenceNumber
, ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned')
INTO Table1_Clean
FROM Table1
GROUP BY
  ReferenceNumber

MAX () ignore les valeurs NULL, convertissez donc tout ce que vous ne voulez pas en NULL en premier, puis MAX (), puis reconvertissez les valeurs NULL en valeurs factices.

Un seul passage, en ligne, ne peut être beaucoup plus efficace.

Autres conseils

Pour SQL SERVER 2000, c'est probablement le plus simple. Première clause = " real " valeurs, deuxième clause où non trouvé dans la première clause. Et une extension de votre idée.

SELECT d2.ReferenceNumber, d2.ReferenceValue
FROM duplicates d2
WHERE d2.ReferenceValue <> 'Not assigned'
UNION ALL
SELECT d1.ReferenceNumber, d1.ReferenceValue
FROM duplicates d1
WHERE NOT EXISTS (SELECT *
         FROM duplicates d2
         WHERE d2.ReferenceNumber = d1.ReferenceNumber AND
                 d2.ReferenceValue <> 'Not assigned')

Toutefois, quels critères souhaitez-vous associer une pause entre " true " valeurs de référence? ou juste en choisir un?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top