Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer les enregistrements en double de la vue

Vous devez avoir des enregistrements en double pour certains/tous les numéros de plainte, utilisez donc DISTINCT ne fonctionnera pas. Prenons un tableau simple tel que

Column1    |    Column2
-----------+------------
A          |    X
A          |    Y

Si vous voulez un seul enregistrement pour Column1 =A, SQL n'a aucun moyen de savoir s'il faut mettre X ou Y dans Column2. C'est le même problème que vous rencontrez mais avec 19 colonnes, pas 2. Vous devez implémenter une sorte de logique pour décider quelle ligne s'affichera pour chaque numéro de plainte. Donc, pour le tableau ci-dessus, si je voulais que X s'affiche dans Column2, j'utiliserais la requête suivante :

SELECT  Column1,
        Column2
FROM    (   SELECT  Column1,
                    Column2,
                    ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column2 ASC) [RowNumber]
            FROM    MyTable
        ) t
WHERE   RowNumber = 1

Ici, j'utilise le ROW_NUMBER() pour hiérarchiser chaque ligne, puis n'afficher que celle qui a la priorité la plus élevée. Si je ne me souciais pas de l'ordre dans lequel ils sortaient, je pourrais utiliser quelque chose comme ça pour choisir une ligne au hasard.

ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY NEWID()) [RowNumber]

Comme je ne sais pas quelle logique appliquer à votre requête, je ne peux pas publier exactement ce dont vous avez besoin, mais je peux essayer de vous aider à démarrer :

SELECT  [Complaint Number],
        [Complaint_For],
        [Total_Complaint_Qty],
        [Defects],
        [Customer Code ],
        [Location],
        [CutomerName],
        [KUNUM],
        [QMNUM],
        [Responsible_KAM]
FROM    (   SELECT  [Complaint Number],
                    [Complaint_For],
                    [Total_Complaint_Qty],
                    [Defects],
                    [Customer Code ],
                    [Location],
                    [CutomerName],
                    [KUNUM],
                    [QMNUM],
                    [Responsible_KAM],
                    ROW_NUMBER() OVER(PARTITION BY [Complaint Number] ORDER BY Complaint_For, Defects) AS RowNumber
            FROM    [CCCMPREPOSITORY].[dbo].[VW_Final_]
        ) data
WHERE   RowNumber = 1

Vous auriez juste besoin de jouer avec le ORDER BY dans les ROW_NUMBER fonction pour répondre à vos besoins.