2012-05-24 11 views
9

Tengo una vista. ¿Cómo puedo mostrar solo registros distintos de él? Hay 19 columnas. Quiero mostrar todo en single sin ningún duplicado, y no quiero eliminar los duplicados. Lo requiero solo para propósitos de visualización.Eliminar registros duplicados de la vista

 SELECT DISTINCT([Complaint Number]),[Complaint_For],[Total_Complaint_Qty] 
     ,[Defects],[Customer Code ],[Location],[CutomerName],[KUNUM],[QMNUM] 
     ,[Responsible_KAM] 
     FROM [CCCMPREPOSITORY].[dbo].[VW_Final_] 

Si uso la consulta anterior, devuelve 1000 registros. Pero si uso la siguiente consulta, devuelve el registro exacto sin duplicado. Pero quiero que se muestren todas las columnas.

 SELECT DISTINCT([Complaint Number]) 
     FROM [CCCMPREPOSITORY].[dbo].[VW_Final_] 

Respuesta

12

Debe tener registros duplicados para algunos/todos los Números de queja, por lo que usar DISTINCT no funcionará. Considere una tabla sencilla como

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

Si sólo desea un registro para la columna 1 = A, SQL no tiene manera de saber si poner X o Y en la columna 2. Este es el mismo problema que tiene pero con 19 columnas, no 2. Debe implementar algún tipo de lógica sobre cómo decidir qué fila se mostrará para cada Número de reclamación. Así que para el cuadro anterior si quería X para mostrar en la columna 2 Me gustaría utilizar la siguiente 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 

Aquí estoy usando la función ROW_NUMBER() dar prioridad a cada fila, entonces sólo mostrar el que tiene la más alta prioridad. Si no me importa el orden en que salieron, podría usar algo así para elegir una fila al azar.

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

Como yo no sé lo que la lógica para aplicar a su consulta no puedo publicar exactamente lo que necesita, pero puedo tratar de empezar:

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 

sólo se necesita que violín con la ORDER BY dentro de la función ROW_NUMBER para satisfacer sus necesidades.

+1

Como un aparte, considere cambiar el nombre de sus columnas y tablas/vistas. Los espacios en los nombres de los objetos son aborrecibles. – GarethD

+1

Gracias. Es 100% funcional ... –

+0

GarethD the Genius ... –

0

no utilizan () para distinct. Sólo tiene que utilizar:

select distinct col1, col2 .. from your_table 
+0

Dará el mismo resultado. –

+0

imposible, la consulta anterior debe producir todos los valores distintos de su tabla. publicar algunos datos, será más fácil ayudar – Diego

1

Probar:

SELECT [Complaint Number], MAX([Complaint_For]), MAX([Total_Complaint_Qty]), ... 
FROM [CCCMPREPOSITORY].[dbo].[VW_Final_] 
GROUP BY Complaint Number 
Cuestiones relacionadas