2012-05-24 142 views
9

我有一個視圖。我如何只顯示不同的記錄。有19列。我想要顯示所有內容而沒有任何重複,並且我不想刪除重複內容。我只需要它用於查看目的。從視圖中刪除重複記錄

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

如果我使用先前的查詢,它將返回1000條記錄。但是,如果我使用以下查詢,它會返回確切的記錄,而不會重複但我想要顯示所有列。

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

回答

12

您必須重複記錄的部分/全部投訴的數字,所以使用DISTINCT將無法​​正常工作。考慮一個簡單的表格,如

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

如果你只想要一個記錄列1 = A,SQL無法知道是否把X或Y在列2的方式。這是你遇到的同樣的問題,但有19列,而不是2.你需要實現某種邏輯,以決定如何決定哪一行將顯示每個投訴號碼。因此,對於上表中,如果我想在X向列2顯示我會用下面的查詢:

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

在這裏,我現在用的是ROW_NUMBER()功能,每一行的優先級,那麼只顯示一個具有最高優先級。如果我不在乎他們出來的順序是什麼,我可能會用這樣的東西來挑選一個隨機排。

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

因爲我不知道是什麼邏輯適用於您的查詢我不能發佈正是你需要的,但我可以嘗試,並讓你開始:

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 

你只需要撥弄ROW_NUMBER函數內的ORDER BY可以滿足您的需求。

+1

另外,考慮重命名你的列和表/視圖。對象名稱中的空格是可惡的。 – GarethD

+1

謝謝..他100%的工作.. –

+0

GarethD天才... –

0

沒有爲distinct使用()。只需使用:

select distinct col1, col2 .. from your_table 
+0

它會給出相同的結果.. –

+0

不可能,上面的查詢應該從您的表中產生所有不同的值。發佈一些數據,這將更容易幫助 – Diego

1

嘗試:

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