SQL Server查询以消除基于单列的重复项,其中另一列可能不同

时间:2014-05-21 12:06:53

标签: sql sql-server

我的表格如下:

Supplier        ReferenceID         Description        Total    
------------------------------------------------------------
smiths          BP657869510L        Order 67543         42
smiths          BP657869510L        Order 67543B        42
smiths          BP654669517L        No. 5621            13
smiths          BP654669517L        No. 56211           13
corrigan        15:51               Order 23542         23
corrigan        15:51               Order 235422        23
williams        14015               Block B             19
williams        14015               Block B2            19

我想写一个T-SQL查询来返回每个供应商的交易清单,根据ReferenceID列消除重复的条目。从表中可以看出,Description值在具有相同ReferenceID的两列中可能不同(由于数据输入错误)。在这种情况下,如果可能的话,我想返回其中一个Description值(我不关心哪一个)。

所以我想根据上面的数据返回的结果是(我随机选择了Description值 - 我没有关于哪一个被返回的偏好,只要它被绑定到原始表格中的ReferenceID。)

    Supplier     ReferenceID        Description        Total    
    --------------------------------------------------------
    smiths       BP657869510L       Order 67543         42
    smiths       BP654669517L       No. 5621            13
    corrigan     15:51              Order 23542         23
    williams     14015              Block B             19

我意识到这很复杂,但任何建议都值得赞赏!

4 个答案:

答案 0 :(得分:2)

您只需要GROUP BY ReferenceID,如果其余内容是任意/相等的,您可以使用MAXMIN

SELECT Supplier = MIN(Supplier),
       ReferenceID,        
       Description = MIN(Description),        
       Total = MIN(Total)
FROM dbo.Tablename
GROUP BY ReferenceID

Demo

答案 1 :(得分:0)

SELECT Supplier
    ,ReferenceID
    ,MAX(Description) [Description]
    ,SUM(TOTAL) [TOTAL] --or MIN/MAX/AVG etc...
FROM TABLE
GROUP BY Supplier
    ,ReferenceID

答案 2 :(得分:0)

如果你想在保持记录完整性的同时为每个ReferenceID拉一条记录,那么你可以像这样使用dense_rank()。

WITH Table_CTE (Supplier, ReferenceID, Description, Total, RefRank) AS
(
  SELECT Supplier, ReferenceID, Description, Total,
         DENSE_RANK() OVER(PARTITION BY ReferenceID ORDER BY Description) As RefRank
  FROM Table
)
SELECT Supplier, ReferenceID, Description, Total
FROM Table_CTE
WHERE RefRank = 1

按照其他人的建议使用GROUP BY可能是一个更简单的解决方案。

答案 3 :(得分:0)

DECLARE @TableName TABLE 
    ([Supplier] varchar(8), [ReferenceID] varchar(12), [Description] varchar(12), [Total] int)
;

INSERT INTO @TableName
    ([Supplier], [ReferenceID], [Description], [Total])
VALUES
    ('smiths', 'BP657869510L', 'Order 67543', 42),
    ('smiths', 'BP657869510L', 'Order 67543B', 42),
    ('smiths', 'BP654669517L', 'No. 5621', 13),
    ('smiths', 'BP654669517L', 'No. 56211', 13),
    ('corrigan', '15:51', 'Order 23542', 23),
    ('corrigan', '15:51', 'Order 235422', 23),
    ('williams', '14015', 'Block B', 19),
    ('williams', '14015', 'Block B2', 19)
;

;WITH CTE AS
(
Select distinct t.Supplier,tt.ReferenceID,t.[Description],Total
 from @TableName t
INNER JOIN 
(Select distinct MIN(Supplier)as r,ReferenceID,MIN([Description]) as k
 From @TableName
GROUP BY ReferenceID )tt
ON tt.ReferenceID = t.ReferenceID
AND t.Supplier = tt.r
AND t.Description = tt.k
GROUP BY t.Supplier,t.[Description],tt.ReferenceID,t.Total
)
Select C.Supplier,C.ReferenceID,C.Description,SUM(C.Total) FROM CTE C
GROUP BY C.Supplier,C.ReferenceID,C.Description
ORDER BY C.Supplier