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.

Computación secuencial del valor a través de las columnas

Dado los valores como se muestra a continuación:

##    Nombre     init     mes1     mes2     mes3     cal1     cal2     cal3
Andy      2.2       1.3       2.5         1.5
Brian     1.8       2.1       1.2         0.8
Cindy     1.5       3.3       3.1         2.2

Quiero usar una sola declaración de SQL para completar las columnas “cal” con la fórmula a continuación:
cal1 = init – mes1
cal2 = init – mes1 – mes2
cal3 = init – mes1 – mes2 – mes3


cal24 = init – mes1 – mes2 … mes24

Entonces el resultado será el siguiente:

##    Nombre     init     mes1     mes2     mes3     cal1     cal2     cal3
Andy      2.2       1.3       2.5         1.5       0.9     -1.2       -2.7
Brian     1.8       2.1       1.2         0.8       -0.3     -1.5       -2.3
Cindy     1.5       3.3       3.1         2.2       -1.8     -4.9       -7.1

Utilizo una forma muy simple para lograr el objetivo:

SELECT a.*
    , a.init - mes1 as cal1
    , a.init - mes1 - mes2 as cal2
    , a.init - mes1 - mes2 - mes3 as cal3
FROM tabla_temporal a

¿Existe una forma más elegante para lograr lo que quiero?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, una manera más elegante de obtener el resultado deseado es utilizando una declaración CASE con múltiples condiciones en la cláusula SELECT. Aquí tienes un ejemplo de consulta que logra el mismo resultado:

    SELECT Nombre, init, month1, month2, month3,
           (CASE WHEN month1 IS NOT NULL THEN (init - month1) ELSE NULL END) AS cal1,
           (CASE WHEN month1 IS NOT NULL AND month2 IS NOT NULL THEN (init - month1 - month2) ELSE NULL END) AS cal2,
           (CASE WHEN month1 IS NOT NULL AND month2 IS NOT NULL AND month3 IS NOT NULL THEN (init - month1 - month2 - month3) ELSE NULL END) AS cal3
    FROM tabla_temporal
    

    Esta consulta utiliza la declaración CASE para verificar si cada columna de mes no es NULL y, de ser así, calcula el valor correspondiente de la columna cal. Si la columna de mes es NULL, entonces el valor de la columna cal también se establece como NULL. Este enfoque es más elegante porque elimina la necesidad de escribir expresiones separadas para cada columna cal, y también resulta en un código más limpio y legible.

Comments are closed.