2016-07-11 14 views
2

以下は、私のテーブルとクエリを見つけることができます。頻度の列に基づいて開始日から終了日までの結果のリストを取得

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 

DUE_DATEはEND_DATEに達するまで、あなたは私がpayment_frequencyに基づいて、各出現についての結果を取得したい見ることができるように(または1ヶ月/年その前に)。

これまでのところ私はいくつかのことを試みましたが、私が望んでいた結果は何も得られていませんでした。 -

+0

だろうが"支払いの総数"の列は良いでしょうか?それは確かによりユニークな形式でデータを保持するでしょう。 – scsimon

+0

私はいくつかの(または現在の)日付に基づいて各番号の次の支払いを得るためにクエリを書くことは可能だと思いますが、すべての支払いとちょうどクエリを使用して譲歩を得ることは不可能です。 – maraca

+0

カーソルをテーブルに挿入してから、テーブルから選択して実行することもできます。 'payment_frequency = 1'ならば各行に行き、' due_date =終了日 'まで' start_date'/'calculated due_date'から年を足してください。その後、毎月の頻度で同じことをします。 – Doolius

答えて

1

私はここにあなたが再帰CTEを使用して何ができるかの例を掲載しています、あなたはあなたのソリューションへの参照としてこれを使用することができます:私はあなたの正確な要件に精通していないよ明らかに

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

ありがとう、これは私が探していたもので、私が必要としている出発点です。 – Sanilas

関連する問題