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.

Consulta SQL: Cómo lograr la actualización subsiguiente de una columna al sumar el valor de la fila actual en una consulta de selección única (necesito evitar el bucle while)

La lógica que estamos tratando de alcanzar en una única consulta es la siguiente:

  1. Necesitamos hacer un bucle basado en la columna del número de fila. Entonces, en cada bucle, necesitamos sumar el valor restante y el nuevo valor… el valor resultante debe actualizarse en “al sumar la columna” y la parte decimal debe actualizarse en la columna del valor decimal.
  2. En el siguiente paso, necesitamos sumar el valor de la columna del valor decimal agrupando por el número de fila. Y el resultado debe actualizarse en la columna del valor restante del siguiente número de fila.
  3. Los pasos anteriores 1 y 2 deben continuarse hasta que lleguemos al último registro.

Logramos esto mediante un bucle while… Pero estamos tratando de lograrlo sin un bucle while.

¿Alguien puede por favor darnos una idea de cómo lograr esto?
Por favor, consulte la imagen adjunta para comprender la tabla.
Imagen

Tags:  

Answer

  1. Avatar for davy.ai

    Para lograr la lógica mencionada anteriormente en una sola consulta sin utilizar un bucle while, podemos utilizar una expresión de tabla común (CTE) recursiva.

    Aquí hay un ejemplo de consulta que logra lo mismo:

    WITH cte AS (
        SELECT row_num, [value], [decimal], [value] as [summed_value], [decimal] as [summed_decimal]
        FROM your_table
        WHERE row_num = 1
        UNION ALL
        SELECT t.row_num, t.[value], t.[decimal], 
               cte.[summed_value] + t.[value] + FLOOR(cte.[summed_decimal] + t.[decimal]), 
               cte.[summed_decimal] + t.[decimal] - FLOOR(cte.[summed_decimal] + t.[decimal])
        FROM your_table t
        JOIN cte ON cte.row_num + 1 = t.row_num
    )
    UPDATE your_table
    SET [value] = cte.[summed_value], [remaining_value] = SUM(cte.[summed_decimal]) OVER (ORDER BY row_num ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
    FROM cte
    WHERE your_table.row_num = cte.row_num
    

    Explicación:

    1. Comenzamos seleccionando la primera fila con un row_num de 1 y estableciendo sus valores [summed_value] y [summed_decimal] en sus valores [value] y [decimal], respectivamente.
    2. A continuación, unimos la CTE con la tabla original mediante row_num + 1 y calculamos los valores [summed_value] y [summed_decimal] para cada fila subsiguiente utilizando la fórmula mencionada en la lógica.
    3. Por último, actualizamos la tabla original uniéndola con la CTE en row_num y estableciendo su columna [value] en el [summed_value] calculado en la CTE, y su columna [remaining_value] en la suma de los valores [summed_decimal] desde la fila actual hasta la última fila.

    Nota: Esta consulta asume que los valores de row_num son continuos y comienzan desde 1. Si este no es el caso, es posible que deba modificar la consulta en consecuencia.

Comments are closed.