Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimuovi i record duplicati dalla visualizzazione

Devi avere record duplicati per alcuni/tutti i numeri di reclamo, quindi utilizza DISTINCT non funzionerà. Considera una tabella semplice come

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

Se si desidera un solo record per Column1 =A, SQL non ha modo di sapere se inserire X o Y in Column2. Questo è lo stesso problema che stai riscontrando ma con 19 colonne, non 2. È necessario implementare una sorta di logica su come decidere quale riga verrà visualizzata per ciascun numero di reclamo. Quindi, per la tabella sopra, se volessi che X fosse mostrato in Column2, userei la seguente query:

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

Qui sto usando il ROW_NUMBER() funzione per assegnare la priorità a ciascuna riga, quindi visualizzare solo quella con la priorità più alta. Se non mi interessa in quale ordine sono usciti, potrei usare qualcosa di simile per scegliere una riga casuale.

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

Dal momento che non so quale logica applicare alla tua query non posso pubblicare esattamente ciò di cui hai bisogno, ma posso provare a iniziare:

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

Dovresti solo giocherellare con ORDER BY all'interno del ROW_NUMBER funzione per soddisfare le tue esigenze.