2015-06-29 2 views
0

Начнет с выборкой данных, я работаю с:Условный подсчет, основанные на сравнение с предыдущей строкой SQL

Policy No | start date 
    1   | 2/15/2006 
    1   | 2/15/2009 
    1   | 2/15/2012   
    2   | 3/15/2006 
    3   | 3/19/2006 
    3   | 3/19/2012 
    4   | 3/31/2006 
    4   | 3/31/2009 

Я пытаюсь написать код в SQL Server 2008, который подсчитывает несколько вещей. Принцип заключается в том, что самая ранняя дата начала существования страхователя - это когда началась политика. Каждые три года клиенту предлагается увеличение. Если они согласятся на увеличение, дата начала обновляется с той же даты, что и оригинал, три года спустя. Если они отклоняются, то ничего не добавляется в базу данных.

Я стараюсь не только подсчитать, сколько раз клиент принял предложение (или увеличил дату начала на три года), но отделил его первым предложением или вторым предложением. Принимая первоначальную дату начала и деля количество дней между датами на 1095, я получаю от меня общее количество предложений, так что я дошел до этого. То, что я действительно хочу, это сравнить каждый номер политики с тем, который был до него, чтобы убедиться, что это то же самое (он уже упорядочен по номеру политики), а затем подсчет изменения даты в новом столбце «принятый» и подсчет времени, 't изменение, но может иметь как "отклонение".

Является ли это случаем, когда мне нужно будет самостоятельно присоединиться к таблице, чтобы сравнить даты? Или есть более простой способ?

+1

Это не очень понятно, что вы пытаетесь сделать здесь. Основываясь на ваших образцах данных, какой должен быть результат? –

+0

Что-то вроде этого: Всего предложений = 12, первые предложения приняты = 2, первые предложения отклоняются = 2, второе предложение принято = 2, второе предложение отклонено = 2, третье предложение принято = 0, третье предложение отклонено = 4. – DemonLlama

+0

Это основано на считая с сегодняшней даты, когда никаких предложений в 2015 году не было принято. – DemonLlama

ответ

1

вы ищете это: -

Set Nocount On; 

Declare @Test Table 
(
    PolicyNo  Int 
    ,StartDate  Date 
) 

Declare @PolicyWithInc Table 
(
    RowId   Int Identity(1,1) Primary Key 
    ,PolicyNo  Int 
    ,StartDate  Date 
) 

Insert Into @Test(PolicyNo,StartDate) Values 
(1,'2/15/2006') 
,(1,'2/15/2009') 
,(1,'2/15/2012')   
,(2,'3/15/2006') 
,(3,'3/19/2006') 
,(3,'3/19/2012') 
,(4,'3/31/2006') 
,(4,'3/31/2009') 

Insert Into @PolicyWithInc(PolicyNo,StartDate) 
Select t.PolicyNo 
     ,t.StartDate 
From @Test As t 

Select pw.PolicyNo 
     ,Sum(Case When Datediff(Year,t.StartDate, pw.StartDate) = 3 Then 1 Else 0 End) As DateArrived 
     ,Sum(Case When Datediff(Year,t.StartDate, pw.StartDate) > 3 Then 1 Else 0 End) As DateNotArrived 
     ,Sum(Case When Isnull(Datediff(Year,t.StartDate,pw.StartDate),0) = 3 Then 1 Else 0 End) As Years3IncrementCount 
From @PolicyWithInc As pw 
     Left Join @PolicyWithInc As t On pw.PolicyNo = t.PolicyNo And pw.RowId = (t.RowId + 1) 
Group By pw.PolicyNo 
1

Вероятно, ниже может помочь:

Set Nocount On; 

Declare @Test Table 
(
    PolicyNo  Int 
    ,StartDate  Date 
) 

Insert Into @Test(PolicyNo,StartDate) Values 
(1,'2/15/2006') 
,(1,'2/15/2009') 
,(1,'2/15/2012')   
,(2,'3/15/2006') 
,(3,'3/19/2006') 
,(3,'3/19/2012') 
,(4,'3/31/2006') 
,(4,'3/31/2009') 

select PolicyNo, StartDate, dateadd(yy, 3, StartDate)Offer1, dateadd(yy, 6, StartDate)Offer2, dateadd(yy, 9, StartDate)Offer3 from 
(select * , row_number() over (partition by PolicyNo order by StartDate) rn from @Test)A 
where rn = 1 

select 
    count(*) * 3 TotalOffersMade, 
    count(Data1.StartDate) FirstOfferAccepted, 
    count(Data2.StartDate) SecondOfferAccepted, 
    count(Data3.StartDate) ThirdOfferAccepted, 
    count(*) - count(Data1.StartDate) FirstOfferDeclined, 
    count(*) - count(Data2.StartDate) SecondOfferDeclined, 
    count(*) - count(Data3.StartDate) ThirdOfferDeclined 
from 
    (
    select PolicyNo, StartDate, dateadd(yy, 3, StartDate)Offer1, dateadd(yy, 6, StartDate)Offer2, dateadd(yy, 9, StartDate)Offer3 from 
    (select * , row_number() over (partition by PolicyNo order by StartDate) rn from @Test)A 
    where rn = 1 
    )Offers 
LEFT JOIN 
    @Test Data1 
    on Offers.PolicyNo = Data1.PolicyNo and Offers.Offer1 = Data1.StartDate 
LEFT JOIN 
    @Test Data2 
    on Offers.PolicyNo = Data2.PolicyNo and Offers.Offer2 = Data2.StartDate 
LEFT JOIN 
    @Test Data3 
    on Offers.PolicyNo = Data3.PolicyNo and Offers.Offer3 = Data3.StartDate 
Смежные вопросы