2012-10-22 57 views
0

我有一个包含start_date列(EV200_EVT_START_DATE)和end_date列(EV200_EVT_END_DATE)的事件表。活动可能会跨越一个月以上。将行拆分为每月行数和拆分天数

我也有一张桌子,每年的每一天(我认为这可能会有所帮助)。

我希望能够按月分摊收入 - 所以基本上我认为我需要将每个事件与每个相应的月份/年份重叠。然后我需要计算事件运行的总天数,并将“加入”月份中的事件日数除以。

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 
+0

你能后你想输出的例子?和源表结构? – d89761

+0

@diana我添加了输入和输出的示例 - 谢谢 –

回答

3

鉴于

  • 设有编号的事件表,开始日期,结束日期和收入
  • ,天表有一个ID列是一个日期,以排为一年的每一天(在你感兴趣的所有年份)

然后这应该给你想要的。但是,如果有什么地方参与,他们可能有当确认收入约规则会计师...

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 

编辑

  • 固定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

+0

是不是您的RevenuePerDay真的是RevenuePerMonth? –

+0

圣洁的**这很简单!我会给它一个尝试:) –

+0

不允许从数据类型datetime到decimal的隐式转换。使用CONVERT函数来运行此查询。 –