Cómo difundir cantidad anual y, a continuación, agregue por mes en SQL

0

Pregunta

Actualmente estoy trabajando con una tabla parecida a esta:

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

el amount en esa tabla es la cantidad mensual total (ex. He de 100 clientes que pagaron $15 para la membresía anual, para mi total cantidad mensual sería de $1500).

Sin embargo lo que me gustaría hacer (y no tengo ni idea de cómo) es dividir la cantidad por 12 y se extendieron hacia el futuro con el fin de tener un ingreso mensual por mes. Como un ejemplo para 2021-09-01 me gustaría conseguir el siguiente:


$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.

Me preguntaba si alguien me podría dar una idea de cómo realizar esto en una consulta SQL/CTE?

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

Mejor respuesta

3

Suponiendo que todos los meses usted se preocupa por existir en su mesa, yo sugeriría algo así como:

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

Por cada mes que existe en la tabla, este sumas 1/12 de la cantidad actual además de las anteriores 11 meses (usando el add_months función). Creo que es lo que quieres.

Un par de notas/pensamientos:

  • Estoy suponiendo (basado en el nombre de la columna) que todas las fechas en el month extremo de la columna en el día 1, así que no necesita preocuparse acerca de la coincidencia de los días o tener la group by retorno de varias filas del mismo mes.
  • Usted podría querer ronda de la SUMs yo lo hice, ya que en algunos casos dividiendo por 12 podría darle más dígitos después de la coma decimal que desea para el dinero (aunque, en ese caso, usted también podría tener que considerar la posibilidad de restos).
  • Si usted realmente solamente una transacción por mes (como en tu ejemplo), usted no necesita hacer el group by.
  • Si los meses en los que la atención acerca de que no existe en la tabla, esto no va a funcionar, pero podría hacer la misma cosa que la generación de una tabla de meses. por ejemplo, Si usted tiene una cantidad en 2020-01-01 pero nada en 2020-02-01, a continuación, esto no devolver una fila para 2021-02-01.
2021-11-23 16:06:20

¿Su SQL a ejecutar?
Adrian White

@AdrianWhite Sí
EdmCoff
1

CTE = configurar conjunto de datos

CTE_2 = pro-tasa de conjunto de datos

FINAL 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

En otros idiomas

Esta página está en otros idiomas

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