如何在SQL中产生收入预测?

时间:2009-12-03 18:35:47

标签: sql sql-server ssas ssis

我有一张表格,其中包含

形式的合约订单项列表
CREATE TABLE contracts_lines (
  contract_id integer,
  product_id integer,
  contract_line_start datetime,
  contract_line_end datetime,
  amount float
)

我想要制作的是一个VIEW(或填充表格),它允许我确定每个月我可以获得多少收入 - 我们有一个简单的规则,即每条线在线的期限内均匀识别(即daily revenue = amount / (contract_line_end - contract_line_start)

VIEW将用作SSAS多维数据集中度量值组的基础,因此其结构应类似于

montly_revenue_forecast (
  year int,
  month int,
  product_id int,
  contract_id int,
  amount float
)

我想做12个月的预测,从它运行的那一天起它将通过SSIS运行,所以我可以访问它的结构(如循环等)我不想写任何存储过程。

感谢任何帮助

2 个答案:

答案 0 :(得分:3)

您需要做的是首先为每个合同/产品生成一系列日期,然后使用序列进行分组。

生成序列最方便的方法是使用文档相当差的spt_values表,如下所示:

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)

请注意 - spt_values中的数字仅从0到2047,所以如果你的合约超过5年,那么你需要生成一个更长的序列。最简单的方法是将spt_values表交叉连接到自身,即:

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

显然你必须将它集成到上面的查询中,但如果确实有必要那么它应该不会太难。

答案 1 :(得分:0)

这不是完整的解决方案,但您可能希望根据30天的月份来计算每个项目的每月收入。

这样的事情:

select contract_id, product_id, 
       amount / (datediff(day, contract_line_start, contract_line_end)) * 30 as MontlyRevenue
from contracts_lines