如何传播的年度金额,然后加个月在SQL

0

的问题

目前我正与一个表,看起来是这样的:

Month     | Transaction          | amount
2021-07-01| Annual Membership Fee| 45
2021-08-01| Annual Membership Fee| 145
2021-09-01| Annual Membership Fee| 2940
2021-10-01| Annual Membership Fee| 1545

amount 该表上的每月总量(前。 我有100个客户支付15美元的年度成员资格,所以我每月总额将$1500).

但是我想做的(而我不知道如何)是分的数额12和传播它的未来,以便有一个每月收入的每个月。 作为一个例子2021-09-01我会得到如下:


$2490/12 = $207.5 (dollars per month for the next 12 months)

in 2021-09-01 I would only get $207.5 for that specific month.

On 2021-10-01 I would get $1545/12 = $128.75 plus $207.5 from the previous month (total = $336.25 for 2021-10-01)

And the same operation would repeat onwards. The last period that I would collect my $207.5 from 2021-09-01 would be in 2022-08-01.

我想知道如果有人能给我一个想法是如何执行这一SQL query/CTE?

snowflake-cloud-data-platform sum
2021-11-23 15:36:26
2

最好的答案

3

假设所有个月你关心的存在于你的表,我建议是这样的:

SELECT 
 month, 
 (SELECT SUM(m2.amount/12) FROM mytable m2 WHERE m2.month BETWEEN ADD_MONTHS(m1.month, -11) AND m1.month) as monthlyamount
FROM mytable m1
GROUP BY month
ORDER BY month

每个月的存在表,这个数额的1/12日的当前数额加上前11个月(使用 add_months功能). 我想这就是你想要的。

几点注意事项/想法:

  • 我假设(依据的列名),所有日期 month 列结束在1楼,因此我们不需要担心的匹配的几天或具有的 group by 返回多行为同一个月。
  • 你可能会想要一轮 SUMs我没有,因为在某些情况下,除以12的可能会给你更多的数字后的小数比你想要钱(虽然,在这种情况下,你可能还需要考虑的余).
  • 如果你真的只有一个事务每个月(如在例),你不需要做的 group by.
  • 如果几个月你关心的不存在于你的表,则这不会的工作,但是你可以做同样的事情发生一个表个月。 例如,如果你有一个数量上的2020-01-01但没有在2020-02-01,那么这将不会返回一个行为2021-02-01.
2021-11-23 16:06:20

你SQL运行?
Adrian White

@AdrianWhite是的
EdmCoff
1

CTE=设立数据集

CTE_2=专业率的数据集

最后SQL= select future_cal_month,sum(pro_rated_amount) from cte_2 group by 1

with cte as (
select '2021-07-01' cal_month,'Annual Membership Fee' transaction ,45 amount
union all select '2021-08-01' cal_month,'Annual Membership Fee' transaction ,145 amount
union all select '2021-09-01' cal_month,'Annual Membership Fee' transaction ,2940 amount
union all select '2021-10-01' cal_month,'Annual Membership Fee' transaction ,1545 amount) 
, cte_2 as (    
select 
    dateadd('month', row_number() over (partition by cal_month order by 1), cal_month) future_cal_month
    ,amount/12 pro_rated_amount
from 
     cte 
    ,table(generator(rowcount => 12)) v)
select 
  future_cal_month
, sum(pro_rated_amount) 
from 
  cte_2 
group by 
  future_cal_month

enter image description here

2021-11-23 21:00:56

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................