在SQL Server中查找每月重复收入

时间:2016-10-14 08:53:20

标签: sql-server

我尝试计算订阅订单的SQL Server数据库中的每月重复收入。

Baremetrics about MRR

获取一些详细信息

如何计算?

假设您有10位客户每人每月支付10美元。以下是计算MRR的方法。

所有非月度计划均按月计算。因此,如果客户在年度计划上为您支付120美元,我们会在未来12个月内向MRR增加10美元。整齐!

因此,到目前为止,我所做的是处理所有原始数据,包括可能影响MRR指标的升级,降级,退款和取消,并准备下表:

DateCreated OrderID     Price   Months
2013-03-05  1           49.9500 12
2013-04-01  2           5.9500  1
2013-04-08  3           7.1100  12
2013-05-15  4           42.9500 3
2013-06-12  5           13.9850 6
2013-06-27  6           7.1100  6
2013-07-29  7           21.9250 3

现在为MRR。我希望有两列,第一列是月份和年份的开始日期(例如01-03-2013),第二列是基于MRR定义的总收入。

例如,OrderID 1应除以12并将结果添加到当前和接下来的11个月。 <{1}} 2应该是该月的所有订阅计划为期1个月并继续。

我知道如何处理其余部分吗?

示例结果:

OrderID

每月添加的价格:

Month       MRR
01-03-2013  4.1625
01-04-2013  4.1625 + 5.95 + 0.5925
01-05-2013  4.1625 + 0.5925 + 14.31 
01-06-2013  4.1625 + 0.5925 + 14.31 + 2.33 + 1.185
01-07-2013  4.1625 + 0.5925 + 14.31 + 2.33 + 1.185
01-08-2013  4.1625 + 0.5925 + 2.33 + 1.185 + 7.30
01-09-2013  4.1625 + 0.5925 + 2.33 + 1.185 + 7.30
01-10-2013  4.1625 + 0.5925 + 2.33 + 1.185 + 7.30
01-11-2013  4.1625 + 0.5925 + 2.33 + 1.185
01-12-2013  4.1625 + 0.5925
01-01-2014  4.1625 + 0.5925
01-02-2014  4.1625 + 0.5925
01-03-2014  0.5925

我将结果留在MRR栏中的操作,以使其清楚。显然,结果应该是它们的总和。

创建输入表:

49.95/12 = 4.1625
5.95/1 = 5.95
7.11/12 = 0.5925
42.95/3 = 14.31
13.985/6 = 2.33
7.11/6 = 1.185
21.925/3 = 7.30

1 个答案:

答案 0 :(得分:0)

我使用递归CTE来尝试获得您可能需要的整个月份范围,但我调整到本月1日 然后我根据该订单是否适用于该月加入,允许它继续保持当前n-1个月(其中n是您的&#39;月份&#39;)然后我收集所有JOINER中的数据(您也可以选择*来查看它)然后我将JOINER聚合成一个月的总和。

我将所有日期调整到本月的第一天以便使用

{{ csrf_token() }}

我认为这很有希望

WITH MTHS AS (SELECT dateADD(day, -DAY(MIN(datecreated)) + 1, MIN(datecreated)) MD, (SELECT MAX(dateadd(month,o2.months, o2.datecreated)) FROM ORDERS o2) AS MXD FROM Orders 
                UNION ALL
                SELECT DATEADD(month,1,MD), MTHS.MXD  FROM MTHS WHERE DATEADD(month,1,MD) < MTHS.mxd),
    JOINER AS
            (
                select MD, ord.price / ord.months mlyprice from MTHS  
                                    JOIN ORDERS ord ON dateadd(day, -day(ord.datecreated) + 1, ord.datecreated) 
                                    BETWEEN 
                                            dateadd(month,1-ord.months,MTHS.md ) 
                                            AND  
                                            MTHS.md 
            )
    SELECT J.MD,SUM(mlyprice)  FROM JOINER J GROUP BY J.MD;