2016-05-13 3 views
0

Я работаю с автором отчета (DataInsights). В этом конкретном отчете у некоторых клиентов есть «Специальный тариф», а некоторые нет. Для тех, кто это делает, есть срок годности. В настоящее время отчет дает несколько строк на каждого клиента, у которого есть специальная ставка, потому что каждое заклинание специальной ставки генерирует свою собственную линию. Нам нужен простой оператор SQL, который будет содержать все записи, которые не имеют «Специальной скорости», и возвращает только строку для последней «Специальной цены» «Дата истечения срока действия», если она попадает в течение последних 3 месяцев. (Если не существует никакого способа, чтобы ограничить его до последних 3-х месяцев, то это нормально, нам нужно просто самая последняя линия)Самая последняя запись в течение 3 месяцев, если таковая существует

Пример:

(ток)

Name  Client #  Rate  Exp. Date 
John Doe  12345  Special  01/12/2014 
John Doe  12345  Special  01/12/2015 
John Doe  12345  Special  01/12/2016 
Jane White  78965 
Dixie Brown  45879  Exceptional 07/30/2011 
Dixie Brown  45879  Exceptional 07/30/2012 
Dixie Brown  45879  Exceptional 07/30/2013 

(должен быть)

John Doe  12345  Special  01/12/2016 
Jane White  78965 
Dixie Brown  45879 
+0

какой тип SQL, PL SQL? – codeMonger123

+0

Это поможет увидеть структуры таблиц, образцы данных, ожидаемый результат, то, что вы пробовали, и почему это не сработало (неправильные данные, сообщение об ошибке и т. Д.). Пожалуйста, прочитайте: http://stackoverflow.com/help/how-to-ask –

ответ

1

Попробуйте это:

select Name, Client, Rate, Date as Special_Date 
from yourtable 
    INNER JOIN 
     (
      select max(Date) Date , Name, Client 
      from yourtable 
      group by Name, Client 
     ) thedatetable 
0

Если ваше имя, клиент и курс всегда одинаковы для каждой группы, как в ваших образцовых данных, вы можете просто сгруппировать по ним, вернув max (expdt). Чтобы получить все записи, где нет специальных ставок и ограничений, которые делают до 3 месяцев, добавьте их в качестве фильтров (используя OR). Используется синтаксис SQL Server ниже и отредактированный некоторые данные немного падать в течение 3 месячного срока:

WITH testdata(Name, Client, Rate, expdt) 
AS(  select 'John Doe', 12345, 'Special', '01/12/2016' 
union all select 'John Doe', 12345, 'Special', ' 03/13/2016' 
union all select 'John Doe', 12345, 'Special', '03/12/2016' 
union all select 'Jane White', 78965, NULL,   NULL 
union all select 'Dixie Brown', 45879, 'Exceptional', '07/30/2016' 
union all select 'Dixie Brown', 45879, 'Exceptional', '07/30/2016' 
union all select 'Dixie Brown', 45879, 'Exceptional', '07/30/2016' 
) 

select Name, client, Rate, max(expdt) expdt from testdata 
where Rate is NULL 
    or expdt>=DATEADD(month, -3, GETDATE()) 
group by Name, client, Rate 

ВЫВОД:

Name  client Rate  expdt   
----------- ------ ----------- ---------- 
Dixie Brown 45879 Exceptional 07/30/2016 
Jane White 78965 null  null  
John Doe 12345 Special  03/12/2016 
Смежные вопросы