我有一张表格,其中包含
形式的合约订单项列表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运行,所以我可以访问它的结构(如循环等)我不想写任何存储过程。
感谢任何帮助
答案 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