0

start_date 列 (EV200_EVT_START_DATE) と end_date 列 (EV200_EVT_END_DATE) を持つイベントのテーブルがあります。イベントは 1 か月以上にわたる場合があります。

また、毎年の毎日のテーブルもあります(これが役立つと思います)。

収益を月ごとに分割できるようにしたいので、基本的には、対応する月/年ごとに各イベントに参加する必要があると思います。次に、イベントが実行される合計日数を計算し、「参加した」月のイベント日数を割る必要があります。

Event Table (EV200_EVENT_MASTER)
===
EV200_EVT_START_DATE,EV200_EVT_END_DATE,EV200_EVT_ID
15/01/2012,17/01/2012,1
15/01/2012,15/02/2012,2
15/01/2012,15/03/2012,3

Calendar Table (EV001_MSTR_DATE_SCHED)
===
EV001_ISO_DATE
01/01/2012
02/01/2012
...
01/01/2021
02/01/2021

Output (something like)
===
EV200_EVT_START_DATE,EV200_EVT_END_DATE,EV200_EVT_ID,Year,Month,Days,Split
15/01/2012,17/01/2012,1,2012,1,2,1
15/01/2012,15/02/2012,2,2012,1,17,0.55
15/01/2012,15/02/2012,2,2012,2,14,0.45
15/01/2012,15/03/2012,3,2012,1,17,0.28
15/01/2012,15/03/2012,3,2012,2,29,0.48
15/01/2012,15/03/2012,3,2012,3,14,0.23
4

1 に答える 1

3

与えられた

  • ID、StartDate、EndDate、Revenue を含むイベント テーブル
  • ID 列が日付で、行が 1 年間の各日 (関心のあるすべての年) である Days テーブル

次に、これはあなたが望むものを与えるはずです。ただし、どこかに会計士が関与している場合、収益がいつ認識されるかについてのルールがある可能性があります...

Select
  Year(d.ID) As Year,
  Month(d.ID) As Month,
  Sum(e.Revenue/Cast((e.EndDate - e.StartDate + 1) As Decimal)) As RevenuePerMonth
From
  Event e
    Inner Join
  Days d
    On e.StartDate <= d.ID And e.EndDate >= d.ID
Group By
  Year(d.ID),
  Month(d.ID)
Order By
  1, 2

編集

  • Terjeが指摘したように、RevenuePerDayをRevenuePerMonthに修正しました
  • テーブル名と列の要件ごとに変更されました。
  • 丸め誤差を回避するための更新 (コメントで試行錯誤をお詫びします)

今回テストしたのは:

Select
  e.Ev200_Evt_Start_Date,
  e.Ev200_Evt_End_Date,
  e.Ev200_Evt_Id,
  Year(d.Ev001_Iso_Date) As Year,
  Month(d.Ev001_Iso_Date) As Month,
  e.Ev200_Evt_End_Date - e.Ev200_Evt_Start_Date + 1 As Days,
  Cast(Count(*) As Decimal)/Cast(e.Ev200_Evt_End_Date - e.Ev200_Evt_Start_Date + 1 As Decimal) As Split
From
  Ev200_Event_Master e
    Inner Join
  Ev001_Mstr_Date_Sched d
    On e.Ev200_Evt_Start_Date <= d.Ev001_Iso_Date And e.Ev200_Evt_End_Date >= d.Ev001_Iso_Date
Group By
  e.Ev200_Evt_Start_Date,
  e.Ev200_Evt_End_Date,
  e.Ev200_Evt_Id,
  Year(d.Ev001_Iso_Date),
  Month(d.Ev001_Iso_Date),
  e.Ev200_Evt_End_Date - e.Ev200_Evt_Start_Date + 1

http://sqlfiddle.com/#!3/d99bc/11/0

于 2012-10-22T18:52:50.240 に答える