2016-07-11 8 views
2

Unten finden Sie meine Tabelle und die Abfrage.Get Liste mit Ergebnissen von Anfang bis Ende basierend auf Frequenz Spalte

SELECT contract.number 
    ,contract.start_date 
    ,contract.end_date 
    ,contract_details.payment_frequency 
    ,contract_details.amount 
FROM contract 
JOIN contract_details 
ON contract.id = contract_details.contract_id 
WHERE contract.status = 'active' 

number start_date end_date payment_frequency amount 
1000 20.02.2015 20.02.2019 1     260.78 
1001 20.02.2015 20.06.2016 12     22.32 
1002 15.03.2015 15.03.2059 1     144.00 
1003 23.02.2015 23.02.2058 1     300.00 
1004 24.02.2015 24.02.2063 1     250.55 

1 = yearly payment 
12 = monthly payment 

Desired Output: 

number start_date end_date due_date payment_frequency amount 
1000 20.02.2015 20.02.2019 20.02.2015 1     260.78 
1000 20.02.2015 20.02.2019 20.02.2016 1     260.78 
1000 20.02.2015 20.02.2019 20.02.2017 1     260.78 
1000 20.02.2015 20.02.2019 20.02.2018 1     260.78 
1001 20.02.2015 20.06.2016 20.02.2015 12     22.32 
1001 20.02.2015 20.06.2016 20.03.2015 12     22.32 
1001 20.02.2015 20.06.2016 20.04.2015 12     22.32 
1001 20.02.2015 20.06.2016 20.05.2015 12     22.32 
and so on 

Wie man sehen kann ich ein Ergebnis für jedes Vorkommen auf dem payment_frequency Basis erhalten möge, bis die DUE_DATE die end_date erreicht (oder 1 Monat/Jahr davor).

Bisher habe ich ein paar Dinge ausprobiert, aber nichts hat mir die Ergebnisse gebracht, auf die ich gehofft hatte.

+0

Offensichtlich i mit Ihren genauen Anforderungen nicht vertraut bin, aber würde eine Spalte "Gesamtzahl der Zahlungen" ist besser? Es würde sicherlich die Daten in einem einzigartigen Format halten. – scsimon

+0

Ich denke, es ist möglich, eine Abfrage zu schreiben, um die nächste Zahlung für jede Nummer basierend auf einem (oder dem aktuellen) Datum zu bekommen, aber alle Zahlungen und Duedaten mit nur einer Abfrage scheint mir unmöglich. – maraca

+0

Konnte es wahrscheinlich mit einem Cursor in eine Tabelle einfügen und dann aus der Tabelle auswählen. Gehe durch jede Zeile, wenn 'payment_frequency = 1', dann füge ein Jahr vom' start_date'/'berechneten Fälligkeitsdatum' bis zum 'Fälligkeitsdatum = Enddatum' hinzu. Dann mache dasselbe mit der monatlichen Häufigkeit. – Doolius

Antwort

1

i hier ein Beispiel von bin Entsendung, was Sie durch die Verwendung rekursiven CTE tun können - man kann dies als Hinweis auf Ihre Lösung verwenden:

declare @tbl table (number int, start_date datetime, end_date datetime, 

payment_frequency smallint, amount numeric(6,2)) 
insert into @tbl 
select 1000 , '10/02/2015',' 10/02/2019', 1,     260.78 
union 
select 1001 , '10/02/2015',' 10/02/2017', 12,     230.78 


; with CTE as 
(select number,start_date,end_date as due_date, end_date from @tbl where end_date>start_date and payment_frequency=1 
union all 
select c.number,c.start_date,dateadd(yy,-1,c.due_date) as due_date,t.end_date from CTE c join @tbl t on t.number=c.number 
where c.due_date<=t.end_date and dateadd(yy,-1,c.due_date)>c.start_date and t.payment_frequency=1 
) 
select * 
from cte 


; with CTE as 
(select number,start_date,end_date as due_date, end_date from @tbl where end_date>start_date and payment_frequency=12 
union all 
select c.number,c.start_date,dateadd(mm,-1,c.due_date) as due_date,t.end_date from CTE c join @tbl t on t.number=c.number 
where c.due_date<=t.end_date and dateadd(mm,-1,c.due_date)>c.start_date and t.payment_frequency=12 
) 
select * 
from cte 
+1

Vielen Dank, das ist genau das, was ich gesucht habe und der Ausgangspunkt, den ich gebraucht habe. – Sanilas

Verwandte Themen