2015-05-19 24 views
2

DISTINCT显示重复的日期,我想过去10个月检索信息,但我有一对夫妇的错误。首先,我的查询基于该PolEffDate场在我的结果早在2013年第二,我看到重复获取数据,如:选择每个客户的电子邮件

EntityID | PolEffDate | EMail | CustNo | Producer | BusinessPhone 
abcde-12345-fghij-67890 | 2013-09-24 | [email protected] | 31000 | Bob Builder | 123-456-7890 
abcde-12345-fghij-67890 | 2013-12-01 | [email protected] | 31000 | Bob Builder | 123-456-7890 
abcde-12345-fghij-67890 | 2014-09-24 | [email protected] | 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

也许转换PolExpDate为日期,而不是将GETDATE的比较为VARCHAR –

+0

你日期的逻辑是不必要的复杂,你可以试试:'BETWEEN DATEADD (月,-10,CAST(GETDATE()AS DATE))和CAST(GETDATE()AS DATE)' – Kittoes0124

+0

什么数据类型是PolExpDate? – xQbert

回答

4

牛,你所看到的重复,因为你必须为每个CustIDBasicPolInfo多个记录的原因。您可以通过运行以下查询确认这一点:

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

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

要解决重复问题,我会推荐GROUP BYMIN()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 
+1

公平点 - 这可能是读取数据的准确的方式,尽管似乎是在十个月混乱。我认为一个简单的'WHERE'条款将是良好的OP而不管合并,但不想将它添加到我知道如果我是正确的轨道上。 – AHiggins