Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 495697
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 13, 20262026-05-13T05:36:57+00:00 2026-05-13T05:36:57+00:00

I have a table with a list of contract line items in the form

  • 0

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

  • 1 1 Answer
  • 2 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-13T05:36:57+00:00Added an answer on May 13, 2026 at 5:36 am

    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:

    WITH Contracts_CTE (contract_id, product_id, contract_day, amount) AS
    (
        SELECT 
            cl.contract_id,
            cl.product_id,
            DATEADD(DAY, v.number, cl.contract_line_start),
            cl.amount / DATEDIFF(DAY, cl.contract_line_start, cl.contract_line_end)
        FROM contracts_lines cl
        CROSS JOIN master.dbo.spt_values v
        WHERE v.type = 'P'
        AND DATEADD(DAY, v.number, cl.contract_line_start) < cl.contract_line_end
    )
    SELECT
        DATEPART(YEAR, c.contract_day) AS contract_year,
        DATEPART(MONTH, c.contract_day) AS contract_month,
        c.product_id,
        c.contract_id,
        SUM(Amount) AS contract_amount
    FROM Contracts_CTE c
    GROUP BY
        c.product_id,
        c.contract_id,
        DATEPART(YEAR, c.contract_day),
        DATEPART(MONTH, c.contract_day)
    

    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.:

    SELECT (v1.number * 2048) + v2.number
    FROM master.dbo.spt_values v1
    CROSS JOIN master.dbo.spt_values v2
    WHERE v1.type = 'P'
    AND v2.type = 'P'
    AND ((v1.number * 2048) + v2.number) < 100000
    

    Obviously you’d have to integrate that into the above query, but if it’s really necessary then it shouldn’t be too hard.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a table which contains a list of Surveys (PK is ID) CREATE
I have a table in my DB with a list of people. I need
I have this table CREATE TABLE [dbo].[friend_blocked_list]( [subdomain] [varchar](50) NOT NULL, [un] [nvarchar](50) NOT
We have a table value function that returns a list of people you may
I have a table a with a list of id's, and a user-defined function
I have a table which holds a list of criminal charges.These charges can be
I have a table which contains a list of products for a company. They
I have a table that contains multiple dropdown menus for a list of profile
I have 2 tables(Companies and Contacts). I need create a list of all of
I have table customer and table contract with one-many relationship (1 customer has many

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.