2012-05-24 13 views
9

Mam widok. Jak mogę wyświetlić z niego tylko odrębne rekordy? Jest 19 kolumn. Chcę wyświetlić wszystko w jednym bez duplikatu i nie chcę usuwać duplikatów. Wymagam tego tylko do celów oglądania.Usuń Duplikaty rekordów z widoku

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

Jeśli użyje poprzedniego zapytania, zwraca 1000 rekordów. Ale jeśli użyję następującego zapytania, zwróci on dokładny rekord bez duplikatu. Ale chcę, żeby wszystkie kolumny były wyświetlane.

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

Odpowiedz

12

Musisz mieć zduplikowane rekordy dla niektórych/wszystkich liczb zarzutu, więc korzystanie DISTINCT nie będzie działać. Rozważmy prostą tabelę takich jak

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

Jeśli chcesz tylko jeden rekord COLUMN1 = A, SQL nie ma możliwości dowiedzenia się, czy umieścić X lub Y w Kolumna2. Jest to ten sam problem, który masz, ale z 19 kolumnami, nie 2. Musisz wdrożyć jakąś logikę, jak zdecydować, który wiersz będzie wyświetlany dla każdego numeru skargi. Więc dla powyższej tabeli, jeśli chciałem X, aby pokazać w Kolumna2 chciałbym użyć następującego zapytania:

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

Tutaj używam funkcji ROW_NUMBER() priorytet każdego wiersza, a następnie tylko wyświetlanie jednego z najwyższym priorytetem. Gdybym nie dbał o to, w jakiej kolejności się pojawią, mógłbym użyć czegoś takiego, by wybrać losowy wiersz.

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

Ponieważ nie wiem, co logika stosuje się do zapytania nie mogę pisać dokładnie to, co trzeba, ale mogę spróbować Ci zacząć:

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 

byłoby Wystarczy pobawić dzięki funkcji ORDER BY w ramach funkcji ROW_NUMBER dopasowanej do Twoich potrzeb.

+1

Zastanów się nad przemianowaniem twoich kolumn i tabel/widoków. Spacje w nazwach obiektów są odrażające. – GarethD

+1

Dziękuję .. W 100% działa .. –

+0

GarethD the Genius ... –

0

nie używać () dla distinct. Wystarczy użyć:

select distinct col1, col2 .. from your_table 
+0

To da ten sam wynik. –

+0

niemożliwe, powyższe zapytanie powinno wytworzyć wszystkie odrębne wartości ze swojej tabeli. opublikuj niektóre dane, łatwiej będzie Ci pomóc – Diego

1

Spróbuj:

SELECT [Complaint Number], MAX([Complaint_For]), MAX([Total_Complaint_Qty]), ... 
FROM [CCCMPREPOSITORY].[dbo].[VW_Final_] 
GROUP BY Complaint Number 
Powiązane problemy