2017-01-28 11 views
0

私は金融ヘッジの価値を計算しようとしていますが、入力をできるだけ簡単にしたいと考えています。たとえば、2014年2月1日から2018年12月31日まで、1か月あたり1,000個の契約を結んでいます(これは必ずしもこの日付範囲ではありません.1か月間、3年以上かかることがあります)。ストライク価格は$ 3です。私は、[ボリューム]、[開始]、[終了]、[ストライク]の4つの列に1行のデータだけを入力したいと考えています。SQL Server:リスト間の月間を表示

問題は2017データを1つの価格で、2018を異なる価格で掛ける必要があることです。簡単な答えは、2017年の行と2018年の行を入力することですが、私は50以上の契約が入っている可能性があり、できるだけ少ない入力をしたいので、これをしたくありません。

価格表の[Year]、[Price]という2つの列を使用します。それは[2017]、[4.50]、[2018]、[5.25]のようになります。これを簡単にすることができれば、毎年ではなく毎月で簡単に修正できます。

私はのラインに沿うように、最終的な計算が必要になります。だから私の質問は、私は範囲で各年の数ヶ月の数を取得する方法、である

2017: 11,000 * (3 - 4.50) = -$16,500 
2018: 12,000 * (3 - 5.25) = -$27,000 
Total value = -$43,500 

?私は出力が

2017, 11 
2018, 12 
+0

日付の範囲内で年ごとの月額をカウントするだけですか? –

+0

契約は常に月の始まり/終わりに開始/終了しますか、月末になることはありますか? –

+0

@JorgeCamposはい、私はそれがすべて私が欲しいと信じています。 – FilburtShellbach

答えて

1

カレンダーテーブルは、このような状況で役に立つことができように、多くのサンプルスクリプトは、ここで、そこにあるものにしたいと思います

は1です:https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

あなたは可能性も単にあなたのprice表に年と月を使用してレンジに参加し、整数型のYear_Month_Intフィールドが続い201601、201602、201603 ... `

」を使用することができます

SELECT * 
FROM contracts c 
JOIN prices p 
    ON p.Year_Month_Int BETWEEN (YEAR(c.start)*100)+MONTH(c.start) AND (YEAR(c.end)*100)+MONTH(c.end) 

あなたがJOIN基準を簡素化することができcontractsテーブルでstartendのための整数バージョン年月が含まれている場合。

+0

ありがとう!私は月曜日にこれを打つつもりです。 – FilburtShellbach

0

範囲の月数をカウントする方法についての他の変形は、次のようになります。

セットアップ:

create table soTest(
    id integer not null auto_increment, 
    start_date datetime, 
    end_date datetime, 
    primary key (id) 
); 

insert into soTest (start_date, end_date) values 
    ('2017-02-01 00:00:00','2018-12-31 00:00:00'); 

問合せ:

select distinct case when extract(year from start_date) = yr 
      then format(datediff(concat(yr,'-12-31'), start_date)/30,0) 
      else format(datediff(end_date, concat(yr,'-01-01'))/30,0) end as qtyMonths, 
     yr 
    from (select s.*, extract(year from start_date) yr from soTest s 
     union all 
     select s.*, extract(year from end_date) yr from soTest s 
     ) a; 

結果:

qtyMonths yr 
    11  2017 
    12  2018 

注意してください彼のテクニックは1つのレジストリの場合にのみ月を数えます。契約からデータを取得するには、データセットテーブルでこれを結合する必要があります。

関連する問題