从SQL查询中删除重复项

时间:2016-11-01 18:29:26

标签: sql sql-server

我目前正在使用此查询来触发客户事件。但有时同一个客户会在结果中,因为他们被分配了一个不同的WorkOrderId,这是我的主要过滤器。所以,我想扩展过滤器以寻找唯一的CustomerName。换句话说,如果查询返回具有相同CustomerName的两行,那么我希望它完全排除第二行。

SELECT CustomerName, JobId, Email, CCEmail, WorkOrderId AS id
FROM dbo.vwWorkOrderDetail
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1
ORDER BY WorkOrderId DESC

我尝试过使用DISTINCT,但我继续在不同的行中获得包含相同CustomerName的结果。如何设置此查询以便返回通过所有WHERE条件的结果,然后仅显示具有唯一CustomerName的行?

2 个答案:

答案 0 :(得分:1)

只要您包含WorkOrderId,DISTINCT就不会为您做任何事情。 DISTINCT只能消除SELECT中指定的所有列包含相同信息的重复项。因此,要使用DISTINCT消除重复客户,您需要执行此操作:

SELECT DISTINCT CustomerName, JobId, Email, CCEmail
FROM dbo.vwWorkOrderDetail
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1
ORDER BY WorkOrderId DESC

保护WorkOrderId的最佳方法是根据基础表创建一个新视图。您需要确定要呈现的可用WorkOrderId的WorkOrderId。通常这是最高ID。如果你需要的只是WorkOrderId本身而不是细节,这实际上非常简单。请注意,下面的代码是一个天真的例子,假设CustomerId直接与工单相关联。要真正正确地回答这个问题,您需要提供vwWorkOrderDetail的代码。

SELECT CustomerName, JobId, Email, CCEmail, (SELECT MAX(WorkOrderId) FROM WorkOrders WHERE CustomerID = Customers.CustomerID) AS WorkOrderID
FROM Customers
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1
ORDER BY WorkOrderId DESC

答案 1 :(得分:0)

SELECT CustomerName, JobId, Email, CCEmail, max(WorkOrderId) AS id
FROM dbo.vwWorkOrderDetail
WHERE JobStatusId=3 AND Active=1 AND LocationStopTypeId=1
GROUP BY CustomerName, JobId, Email, CCEmail