Sql server 选择“显示每个客户电子邮件的重复日期”
我试图检索过去十个月的信息,但有几个错误。首先,我的查询是从2013年开始获取数据的。其次,我在基于PolEffDate字段的结果中看到了重复项,如下所示:Sql server 选择“显示每个客户电子邮件的重复日期”,sql-server,select,sql-server-2012,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-123
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'
谢谢你的帮助。我会尽力回答任何问题。Daniel,您看到的重复是因为您在BasicPolInfo中有多条记录用于每个CustID值。您可以通过运行以下查询来确认这一点:
SELECT CustID, COUNT(*)
FROM BasicPolInfo
GROUP BY CustID
HAVING COUNT(*) > 1
根据您的模式,这可能不是一个问题-毕竟,这可能有一个完全合理的原因!我猜每个客户都有多个保单
要解决重复问题,我建议使用最小值或最大值的GROUP BY
您的另一个问题,即从早期日期检索数据,是因为您可能选择PolEffDate,策略生效日期,但可能筛选PolExpDate,策略到期日期。你打算用哪一种?过去十个月内完成的政策可能比这更早开始实施
若要解析更宽的日期范围,请在SELECT和WHERE子句中引用相同的值
使用MAX和PolExpDate进行以下查询:
也许将PolExpDate转换为日期而不是将GETDATE的比较转换为Varchar您的日期逻辑不必要地复杂,请尝试以下操作:DATEADDMONTH,-10,CASTGETDATE作为日期,CASTGETDATE作为日期PolExpDate是什么数据类型?公平点-这可能是读取数据的准确方法,尽管在过去的十个月里看起来很混乱。我认为一个简化的WHERE子句对OP的合并是有好处的,但是在我知道我是否在正确的轨道上之前,我不想添加它。
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