用各种条件计算对定期付款的未来收入预测

|| 我有各种包装的服务,可以每月,每季度,每半年和每年购买。 每个软件包都有一个Due_on日期,当有人续约时我会增加。 通过检查谁在本月有到期日,可以很容易地计算出我本月可以大致预期的收入。 我遇到麻烦的地方是计算下一年我每个月可以期望获得多少收入。我不能以Due_on为基础,因为有些人明年会支付12倍,有些人会支付6倍,依此类推。 做这个的最好方式是什么? 注意:为此,我忽略了损耗。 我正在使用PHP和MySQL,但是我要求理论知识,所以不要太在意。     
已邀请:
让我们以计算未来12个月的每月收入为例。 我可以看到两种基本方法: 在接下来的12个月中,每个创建一个存储桶数组(或哈希)。然后,遍历每个活动订阅,并为每个订阅将预期的收入添加到每个适当的存储桶中。例如,如果条款是按月支付,则将该付款添加到每个存储桶中;如果该期限为季度,则将该付款添加到当前截止日期月份的存储桶中,并在此之后的3、6和9个月内添加该存储桶;等等。这非常容易编写代码,但是如果有足够的客户来生成报告,则可能需要一些时间。 在您的mysql数据库中创建一个临时表,该表的列为(
month
,ѭ1with),并用一系列插入语句填充(有一堆;一会儿我将介绍它们),然后执行报告那张桌子。 这有点不寻常,所以我将更详细地说明它。我正在对您的SQL表结构进行一些假设,但我正在尝试使其尽可能通用。 因此,首先您需要临时表,然后我们将根据当前的“ѭ2”日期,以每月收入首次填充该临时表:
CREATE TEMPORARY TABLE FutureRevenueReport
SELECT
  CONCAT(YEAR(s.due_on), \'-\', MONTH(s.due_on)) as revenue_month,
  s.due_amount as revenue_amount
FROM subscriptions s WHERE s.active = \'True\';
现在在同一个mysql会话中,执行以下一系列插入语句以填充将来的收入:
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 1 MONTH), \'-\', 
              MONTH(s.due_on + INTERVAL 1 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = \'True\' AND s.term = \'MONTHLY\';

INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 2 MONTH), \'-\', 
              MONTH(s.due_on + INTERVAL 2 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = \'True\' AND s.term = \'MONTHLY\';

INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), \'-\', 
              MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = \'True\' AND s.term = \'MONTHLY\';
-- etc, up to + INTERVAL 11 MONTH

-- Now the quarterly:
INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 3 MONTH), \'-\', 
              MONTH(s.due_on + INTERVAL 3 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = \'True\' AND s.term = \'QUARTERLY\';

INSERT INTO FutureRevenueReport(revenue_month, revenue_amount)
SELECT CONCAT(YEAR(s.due_on + INTERVAL 6 MONTH), \'-\', 
              MONTH(s.due_on + INTERVAL 6 MONTH)), s.due_amount
FROM subscriptions s WHERE s.active = \'True\' AND s.term = \'QUARTERLY\';
-- And the same for 9 months
-- Then do the same thing for SEMI-ANNUALLY and + INTERVAL 6 MONTH

-- And now the report:
SELECT revenue_month, sum(revenue_amount) as revenue from FutureRevenueReport
GROUP BY revenue_month;
    

要回复问题请先登录注册