我将创建一个代表月份的表或视图,并根据开始和结束日期加入支出表。这应该为记录跨越的每个月提供一行。
有很多方法可以做到这一点,在这个例子中,
我会要求你创建一个 tally 表(google it 或 StackOverflow),其中包含整数 0,1,2,3,4,5,6,... 在单个列 n 中,你可以调整月数和开始日期以适合您的数据。
注意我使用了 nextMonthStart,因为从每个月中减去一天更容易,因为我可以在以后的连接中使用
CREATE VIEW MonthList
as
SELECT TOP (240)
DATEADD(month, n, '2000-01-01') as MonthStart
, DATEADD(month, n + 1, '2000-01-01') as NextMonthStart
FROM tally
其次,计算该记录与该月重叠的天数 * 平均每日支出。
为了整洁,我假设您的桌子只是称为放置。
请注意,我必须在除法之前投射您的 ordered_net 和放置持续时间,您可能需要更改数据类型以适合您的数据库和数据。
select
placement_id
, placement_start_date
, placement_end_date
, DailySpend * DATEDIFF(day, PeriodStart, PeriodEnd) as PeriodSpend
FROM (
SELECT placement_id
, placement_start_date
, placement_end_date
, CAST(ordered_net as decimal(12,5))
/ CAST( DATEDIFF(day, placement_start_date, placement_end_date) as decimal(12.5)) as DailySpend
, CASE WHEN placement_start_date > monthStart THEN placement_start_date else monthStart end as PeriodStart
, CASE WHEN placement_end_date < nextmonthStart THEN placement_end_date else DATEADD(day, -1, nextmonthStart) end as PeriodEnd
from placement inner join
monthList on placement_start_date < nextMonthStart
and placement_end_date >= monthStart
) as monthlyCalcs
这应该可以在 sql-server 中使用,您可能需要对 DATEDIFF 计算、JOIN 的形式和替代数据库的 CAST 进行微小的更改。
编辑
您可以在外部查询中公开更多数据,以便验证每个期间的天数是否正确。您还可以将文本描述添加到 MonthList 视图,以便您可以看到该行也适用于哪个月份。不要忘记对这些值求和以检查“pro rate”是否正确拆分了这些值。