Cómo distribuir la cantidad anual y luego sumar por mes en SQL.
Actualmente estoy trabajando con una tabla que se ve así:
Mes | Transacción | cantidad
2021-07-01| Cuota de Membresía Anual| 45
2021-08-01| Cuota de Membresía Anual| 145
2021-09-01| Cuota de Membresía Anual| 2940
2021-10-01| Cuota de Membresía Anual| 1545
la cantidad
en esa tabla es la cantidad total mensual (por ejemplo, si tengo 100 clientes que pagaron $15 por la membresía anual, mi cantidad mensual total sería de $1500).
Sin embargo, lo que me gustaría hacer (y no tengo idea de cómo hacerlo) es dividir la cantidad por 12 y distribuirla en el futuro para tener un ingreso mensual por mes. Como ejemplo para el 2021-09-01, obtendría lo siguiente:
<p>$2490/12 = $207.5 (dólares por mes para los siguientes 12 meses)</p>
<p>en 2021-09-01 solo recibiría $207.5 para ese mes específico.</p>
<p>En 2021-10-01 recibiría $1545/12 = $128.75 más $207.5 del mes anterior (total = $336.25 para 2021-10-01)</p>
<p>Y la misma operación se repetiría en adelante. El último período en el que recibiría mis $207.5 del 2021-09-01 sería en 2022-08-01.
Me preguntaba si alguien podría darme una idea de cómo hacer esto en una consulta/CTE de SQL?
davy.ai
Una posible solución es utilizar una CTE (Expresión de tabla común) para primero calcular el monto total dividido entre 12 para cada fila, y luego utilizar una función de ventana para acumular gradualmente los montos mensuales con el tiempo. Aquí hay una consulta de ejemplo basada en la estructura de su tabla:
La CTE llamada
monthly_amounts
primero calcula elmonthly_amount
dividiendo elamount
entre 12.La consulta principal luego selecciona el
Month
,Transaction
y un total acumulado demonthly_amount
utilizando la función de ventanaSUM() OVER (...)
. La cláusulaORDER BY
especifica que el total acumulado debe ordenarse por la columnaMonth
. La cláusulaROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
especifica que el total acumulado debe incluir todas las filas desde el inicio de la partición (es decir, la primera fila) hasta e incluyendo la fila actual.Puede ejecutar esta consulta contra su tabla y debería devolver un conjunto de resultados que muestra los ingresos mensuales acumulados por cada fila, como se describe en su pregunta. Tenga en cuenta que el total acumulado comenzará con el mismo valor que
monthly_amount
para la primera fila y terminará conmonthly_amount
de la última fila.