如何使用sql计算累计支付mrr?

brvekthn  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(382)

我有一个包含以下数据的表:
客户| id |日期| mrr |更改
mrrïu change是客户订阅中超过上一笔交易的增量收入变化。因此,如果客户以20美元/月的价格购买计划,然后升级到30美元/月的计划,则此交易的mrr\ U更改将为30-20美元=10美元/月。

  • 在下一笔交易发生之前,您可以假设客户正在支付他/她在上一笔交易中支付的金额。例如,如果最新的事务是在计划11-->上升级的,我们可以假设客户当前在计划11上仍然处于活动状态

我们要计算截至2018年1月1日每个客户的累计付款mrr。
输入:

+-------------+-------------------+------------+
| Customer_ID |     Txn_date      | MRR_Change |
+-------------+-------------------+------------+
|      190290 | 01 April 2016     |        260 |
|      190290 | 01 May 2016       |         31 |
|      190290 | 01 July 2016      |        -76 |
|      190290 | 01 September 2016 |        260 |
|      190290 | 01 October 2016   |       -260 |
+-------------+-------------------+------------+

输出:

+-------------+-----------------------+
| Customer_ID | Cumulative_Paying_MRR |
+-------------+-----------------------+
|      190290 | $ 4,972               |
+-------------+-----------------------+
kcwpcxri

kcwpcxri1#

您可以按客户id分组,对相关交易日期的change列求和。
避免编写sql,因为这与家庭作业非常相似。

plupiseo

plupiseo2#

欢迎来到mysql on so!
@混乱正指引着你正确的方向,但答案有点不完整。
仅仅总结这些变化是不够的。你需要知道有多少笔交易是用这个金额过账的。从您提供的数据来看,这并非微不足道。
对于每次更改,您需要知道自该日期以来已支付了多少笔款项,然后将更改乘以付款次数,并将此金额相加。
你怎么知道付款的次数?假设每月有一次付款,那么您需要计算结束日期和更改日期之间的月数。您可以使用mysql函数period_diff来实现这一点,但是您需要将参数转换为正确的格式,因为它不需要日期。如果列txndate实际上是一个日期,那么可以使用date\u format函数以所需的格式创建参数。如果不是日期,则必须先将其转换为日期,然后才能使用date\ format函数,或者可以直接转换为period\ diff所需的格式。
注意period_diff给出了两个日期之间的时段数。如果您想同时包含这两个(这似乎是您所需要的),您需要在结果中添加1。
所以你需要这样的东西:

SELECT Customer_ID, SUM((PERIOD_DIFF(<arg1>, <arg2>)+1)*MRR_Change)
  FROM <TableName> GROUP BY Customer_ID

很明显,您需要为period_diff函数指定适当的参数,当然,我不能保证没有输入错误!
这足以让你找到正确的答案,

kxxlusnw

kxxlusnw3#

在sql中计算累积和(有时称为“滚动和”)的最佳方法是使用窗口函数:

WITH t1 (date,count_events) AS 
  ( SELECT * FROM  (VALUES  ('2020-01-10',3),('2020-01-11',4),('2020-01-13',1),('2020-01-17',2),('2020-01-22',5))) 
SELECT *, sum(count_events) over (order by date) cumulative_sum
FROM t1
ORDER BY date
Results
date        count_events    cumulative_sum
2020-01-10  3               3
2020-01-11  4               7
2020-01-13  1               8
2020-01-17  2               10
2020-01-22  5               15

这个例子来自presto,它为每一行计算从表开始到当前行的总和。有很多细节,但这是基本的。
很多网站都有解释,比如这一个,还有更多。。

bwleehnv

bwleehnv4#

请在下面找到解决方案:

DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2015-01-01';
SET @ToDate = '2018-12-31';

;with date_dimension as( 
SELECT TOP (DATEDIFF(MONTH, @FromDate, @ToDate)+1) 
  TheDate  = DATEADD(MONTH, number, @FromDate)
  FROM [master].dbo.spt_values 
  WHERE [type] = N'P' ORDER BY number),
distinct_customer as(
SELECT DISTINCT Group_ID from Sheet1$),
date_customer as(
SELECT * from date_dimension a, distinct_customer b),
date_customer_mrr as(
select a.TheDate, a.Group_ID, coalesce(b.MRR_Change,0) as MRR_Change from date_customer a left join Sheet1$ b on a.TheDate = b.Txn_date)
select a.Group_ID, sum(a.cumulative_paying_mrr) as cumulative_paying_mrr from
(select Group_ID, sum(MRR_Change) over(order by TheDate asc rows between unbounded preceding and current row) cumulative_paying_mrr  from date_customer_mrr where TheDate < '2018-01-01 00:00:00.000') a
group by a.Group_ID

相关问题