es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    WITH monthly_amounts AS (
      SELECT 
        Month, 
        Transaction, 
        amount / 12 AS monthly_amount
      FROM my_table
    )
    SELECT 
      Month, 
      Transaction, 
      SUM(monthly_amount) 
        OVER (ORDER BY Month 
              ROWS BETWEEN UNBOUNDED PRECEDING 
                       AND CURRENT ROW) AS accumulated_amount
    FROM monthly_amounts
    

    La CTE llamada monthly_amounts primero calcula el monthly_amount dividiendo el amount entre 12.

    La consulta principal luego selecciona el Month, Transaction y un total acumulado de monthly_amount utilizando la función de ventana SUM() OVER (...). La cláusula ORDER BY especifica que el total acumulado debe ordenarse por la columna Month. La cláusula ROWS 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á con monthly_amount de la última fila.

Comments are closed.