续费模式下的客户增长率计算

 

问题

一家杀毒软件公司的产品采用按时间购买的方式销售,用户必须不断续购“许可 key”才可以继续使用软件,“许可 key”分为半年授权、一年授权和终身授权,详细情况如下:

ID Key Type TermOfValidity Price
1 Six months 6 months 20
2 One Year 12 months 36
3 Unlimited Infinity 500

下面是该公司推行这种销售模式后头几年的销售记录表:

imagepng

如果客户授权到期而又没有续购授权,则停止软件使用,不再视为公司客户。请算出公司这头几年中每年的客户增长率。

思路

大致思路:此问题由于涉及到年底结算的问题,而年份又不是确定的,所以需要按天循环,同时用另一个序表来同步记录当前的客户,在每一天的循环中,删去已经过期的用户,添加新的用户,并给老用户续费,而后到了年底再结算用户数量即可。

  1. 先写出每种 key 的有效期延长时间,并写入序表。由于延长时间不是确定的(大月小月平年闰年等),所以这里用 after 函数将其计算方法的算式写下来,后面的计算中直接调用即可。

  2. 先做一些循环之前的准备,首先创建一个记录当前有效用户的序表,再建立一个记录年用户数和增长率的结果表。

  3. 先标记好按天循环的前后范围,也就是销售记录的日期范围。

  4. 循环销售记录日期范围内的每一天。循环体内,首先删除当天已经超过有效期的客户。

  5. 找出当天的销售记录。

  6. 循环这些记录,在客户表中找出相应的客户,如果没有则新建一条客户记录。

  7. 按照销售记录所购买的 key 类型,算出用户的有效期。

  8. 如果到了年底,将当前的客户数量写入前面的结果表中。

  9. 循环结束后,再用结果表算出每一天的客户数量增长率。

代码

A B C D
1 =file("C:\\txt\\AVwareSales.txt").import@t().sort(Date) 销售记录表
2 /ID / 算式 写出各种 Key 的日期算式备用
3 1 elapse@m(?,6) 算式备用
4 2 elapse@y(?,1)
5 3 ’null
6 =create(ID,Pattern).record([A3:B5],0) =A6.keys(ID) 将 KeyID 和算式写入序表
7 =create(User,TermOfValidity) =A7.keys(User) 创建一个当前用户表
8 =create(Year,NoOfUsers,GrowthRate) 创建一个记录增长率结果表
9 =date(A1.Date) =date(A1.m(-1).Date) 循环起始日期和结束日期
10 for >A7.delete(A7.select(TermOfValidity!=null && TermOfValidity<A9)) 循环每天。删除当天已经过有效期的用户
11 =A1.select(date(Date)==A9) 找出当天的销售记录
12 for B11 =A7.find(B12.User) 循环这些销售记录,找出相应的用户记录
13 if C12==null >A7.insert(0,B12.User,A9) 如果没有,就新建记录
14 >C12=A7.m(-1)
15 >C12.run(TermOfValidity=eval(A6.find(B12.KeyID).Pattern,TermOfValidity)) 按照 key 相应的算式,算出新的有效期
16 if month(A9)==12 && day(A9)==31 如果到了年底
17 >A8.insert(0,year(A9),A7.count()) 记下当前的用户数量
18 >A9=elapse@d(A9,1) 循环变量增进一天
19 if A9>B9 break 如果循环超过了销售记录的日期范围,就可以结束循环了
20 =A8.run(if(#>1,GrowthRate=round((NoOfUsers-NoOfUsers[-1])/NoOfUsers[-1],2))) 算出每年的客户增长率

结果

imagepng