Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Remover registros duplicados da visualização


Você deve ter registros duplicados para alguns/todos os Números de Reclamação, então usando DISTINCT não funciona. Considere uma tabela simples, como
Column1    |    Column2
-----------+------------
A          |    X
A          |    Y

Se você quiser apenas um registro para a Coluna1 =A, o SQL não tem como saber se deve colocar X ou Y na Coluna2. Este é o mesmo problema que você está tendo, mas com 19 colunas, não 2. Você precisa implementar algum tipo de lógica para decidir qual linha será exibida para cada Número de Reclamação. Então, para a tabela acima, se eu quisesse que X fosse mostrado na Coluna2, eu usaria a seguinte consulta:
SELECT  Column1,
        Column2
FROM    (   SELECT  Column1,
                    Column2,
                    ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY Column2 ASC) [RowNumber]
            FROM    MyTable
        ) t
WHERE   RowNumber = 1

Aqui estou usando o ROW_NUMBER() função para priorizar cada linha, exibindo apenas aquela com a prioridade mais alta. Se eu não me importasse com a ordem em que eles saíssem, eu poderia usar algo assim para escolher uma linha aleatória.
ROW_NUMBER() OVER(PARTITION BY Column1 ORDER BY NEWID()) [RowNumber]

Como não sei qual lógica aplicar à sua consulta, não posso postar exatamente o que você precisa, mas posso tentar começar:
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

Você só precisaria mexer com o ORDER BY dentro do ROW_NUMBER função para atender às suas necessidades.