从视图中删除重复记录

时间:2012-05-24 08:33:33

标签: sql sql-server sql-server-2008

我有一个观点。如何仅显示其中的不同记录。有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_]

3 个答案:

答案 0 :(得分:12)

您必须拥有部分/全部投诉号码的重复记录,因此使用DISTINCT将无效。考虑一个简单的表,如

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

如果只需要Column1 = A的一条记录,SQL无法知道是否在Column2中放置X或Y.这是你遇到的同样的问题,但有19列,而不是2.你需要实现某种逻辑,以确定如何为每个投诉编号显示哪一行。因此,对于上表,如果我希望X在Column2中显示,我将使用以下查询:

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

您只需摆弄ORDER BY函数中的ROW_NUMBER即可满足您的需求。

答案 1 :(得分:1)

尝试:

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

答案 2 :(得分:0)

不要将()用于distinct。只需使用:

select distinct col1, col2 .. from your_table