I have a table with a list of contract line items in the form of
CREATE TABLE contracts_lines (
contract_id integer,
product_id integer,
contract_line_start datetime,
contract_line_end datetime,
amount float
)
What I would like to produce is a VIEW (or populate a table) that allows me to determine how much revenue I can expect each month – we have a simple rule that each line is recognized evenly over the term of the line (i.e. daily revenue = amount / (contract_line_end - contract_line_start) )
The VIEW will be used as the basis for a measure group in an SSAS cube, so its structure should be something like
montly_revenue_forecast (
year int,
month int,
product_id int,
contract_id int,
amount float
)
I’d like to do 12 months worth of forecast, from the day it’s run and it will run through SSIS so I have access to its contstructs (like looping, etc.) I’d prefer not to have to write any stored procedures.
Any help is appreciated
What you need to do is first generate a sequence of dates for each contract/product and then use the sequence to group.
The most convenient way to generate a sequence is to use the rather poorly-documented spt_values table, like so:
Just a word of caution – the numbers in spt_values only go from 0 to 2047, so if you have contracts that are more than about 5 years long, then you’ll need to generate a longer sequence. Easiest way to do that is to CROSS JOIN the spt_values table to itself, i.e.:
Obviously you’d have to integrate that into the above query, but if it’s really necessary then it shouldn’t be too hard.