SELECT DISTINCT显示每个客户电子邮件的重复日期

时间:2015-05-19 17:03:25

标签: sql-server select sql-server-2012

我正在尝试检索过去十个月的信息,但我遇到了一些错误。首先,我的查询是从2013年开始获取数据。其次,我在基于PolEffDate字段的结果中看到重复数据,如下所示:

EntityID | PolEffDate | EMail | CustNo | Producer | BusinessPhone
abcde-12345-fghij-67890 | 2013-09-24 | somewhere@email.com | 31000 | Bob Builder | 123-456-7890
abcde-12345-fghij-67890 | 2013-12-01 | somewhere@email.com | 31000 | Bob Builder | 123-456-7890
abcde-12345-fghij-67890 | 2014-09-24 | somewhere@email.com | 31000 | Bob Builder | 123-456-7890

这是我的SQL查询:

SELECT DISTINCT
     CONVERT(VarChar(36), Customer.CustId) AS EntityID
     , BasicPolInfo.PolEffDate, Customer.EMail, Customer.CustNo
     , (isnull(Employee.Firstname + ' ','') + isnull(Employee.LastName,'')) 
     AS Producer, Employee.BusFullPhone
FROM
     Customer INNER JOIN BasicPolInfo ON Customer.CustId = BasicPolInfo.CustId INNER JOIN
    Transaction ON BasicPolInfo.PolId = Transaction.PolId INNER JOIN
    GeneralBranch ON Customer.GLBrnchCode = GeneralBranch.GLBrnchCode INNER JOIN
    GeneralDepartment ON Customer.GLDeptCode = GeneralDepartment.GLDeptCode INNER JOIN
    GeneralDivision ON Customer.GLDivCode = GeneralDivision.GLDivCode INNER JOIN
    Employee ON BasicPolInfo.ExecCode = Employee.EmpCode
WHERE   
     BasicPolInfo.PolExpDate >= DATEADD(MONTH, -10,CONVERT(VARCHAR(11),GETDATE(),106)) 
     AND BasicPolInfo.PolExpDate <= CONVERT(VARCHAR(11),GETDATE(),106)
     AND Customer.Active = 'Y'
     AND Customer.typeCust = 'P'

感谢您的帮助。我会尽力回答任何问题。

1 个答案:

答案 0 :(得分:4)

Daniel,您看到的重复是由于每个BasicPolInfo值在CustID中有多条记录而导致的。您可以通过运行以下查询来确认:

SELECT CustID, COUNT(*)
FROM BasicPolInfo
GROUP BY CustID
HAVING COUNT(*) > 1

根据您的架构,这可能不是问题 - 毕竟,可能有一个完全正当的理由!我猜测每个客户有多个政策。

要解决重复问题,我建议您GROUP BY使用MIN()MAX()

您的其他问题,即从早期日期检索数据的问题,是因为您选择PolEffDate(可能是政策生效日期),而是过滤PolExpDate(可能是政策到期日期)。你打算用哪个?在过去十个月的某个时间完成的政策可能比这更早开始。

要解决更广泛的日期范围,请在SELECTWHERE子句中引用相同的值。

下面的查询(使用MAX()PolExpDate):

SELECT 
     CONVERT(VarChar(36), Customer.CustId) AS EntityID, 
     MAX(BasicPolInfo.PolExpDate) AS PolExpDate, -- note that this is now PolExpDate
     Customer.EMail, 
     Customer.CustNo, 
     (isnull(Employee.Firstname + ' ','') + isnull(Employee.LastName,'')) AS Producer, 
     Employee.BusFullPhone
FROM
    Customer INNER JOIN 
    BasicPolInfo ON Customer.CustId = BasicPolInfo.CustId INNER JOIN
    [Transaction] ON BasicPolInfo.PolId = [Transaction].PolId INNER JOIN
    GeneralBranch ON Customer.GLBrnchCode = GeneralBranch.GLBrnchCode INNER JOIN
    GeneralDepartment ON Customer.GLDeptCode = GeneralDepartment.GLDeptCode INNER JOIN
    GeneralDivision ON Customer.GLDivCode = GeneralDivision.GLDivCode INNER JOIN
    Employee ON BasicPolInfo.ExecCode = Employee.EmpCode
WHERE   
     BasicPolInfo.PolExpDate >= DATEADD(MONTH, -10,CONVERT(VARCHAR(11),GETDATE(),106)) 
     AND BasicPolInfo.PolExpDate <= CONVERT(VARCHAR(11),GETDATE(),106)
     AND Customer.Active = 'Y'
     AND Customer.typeCust = 'P'
GROUP BY 
     CONVERT(VarChar(36), Customer.CustId), 
     Customer.EMail, 
     Customer.CustNo, 
     (isnull(Employee.Firstname + ' ','') + isnull(Employee.LastName,'')), 
     Employee.BusFullPhone