2015-05-19 5 views
2

Я пытаюсь получить информацию за последние десять месяцев, но у меня есть несколько ошибок. Во-первых, мой запрос получает данные еще в 2013 г. Во-вторых, я вижу дублей в моих результатах на основе PolEffDate поля, как это:SELECT DISTINCT, показывающий повторяющиеся даты на адрес электронной почты клиента

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 в DATE вместо преобразования сравнения GETDATE в –

+0

Вашей даты логики VARCHAR является излишне сложным, попробуйте что-то вроде: 'МЕЖДУ DATEADD (MONTH, -10, CAST (GETDATE() AS DATE)) И CAST (GETDATE() AS DATE) ' – Kittoes0124

+0

какой тип данных является PolExpDate? – xQbert

ответ

4

Даниил, дублирование, которое вы видите, вызвано тем, что у вас есть несколько записей в BasicPolInfo для каждого значения CustID. Вы можете подтвердить это, выполнив следующий запрос:

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

В зависимости от схемы, это не может быть проблемой - в конце концов, там, вероятно, вполне законные основания для этого! Множество политик для Клиента - это мое предположение.

Чтобы устранить дублирование, я бы порекомендовал GROUP BY с MIN() или MAX().

Другая проблема, связанная с получением данных из более ранних дат, заключается в том, что вы выбираете PolEffDate (предположительно, дату вступления в силу политики), но фильтруете PolExpDate (предположительно, срок действия политики). Что вы собираетесь использовать? Политики, которые закончились за последние десять месяцев, могли начаться гораздо раньше.

Чтобы устранить более широкий диапазон дат, укажите то же значение в своих предложениях SELECT и WHERE.

запроса ниже (с использованием 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

Смежные вопросы