none
SQL SERVER Actualizar varios registros con un fecha a la fecha de otro campo mas 1

    Question

  • Hola, tengo una tabla con los campos [numero], [fechaalta], [fechabaja].

    Hay varios registros en los que [número] tiene varias [fechabaja] igual a NULL, y quiero actualizar todos esos NULL a ([fechaalta] del siguiente registro +1)excepto el último [fechabaja] que debe quedar a NULL.

    Asi está ahora:
    Numero fechaalta    fechabaja
    1      01/01/1990   01/02/1990
    1      02/02/1990    null
    1      03/01/1990    null
    1      04/01/1990    null

    Y quiero que quede así:
    Numero fechaalta    fechabaja
    1      01/01/1990   01/02/1990
    1      02/02/1990   03/02/1990
    1      03/03/1990   04/03/1990
    1      04/04/1990    null


    ¿ Me podeis ayudar?

    Gracias

    Wednesday, May 30, 2012 11:49 AM

Answers

  • ¿Es SQL Server 2005, 2008, R2 ó 2012? Si es una de estas versiones, puedes usar una función de ventana.

    PASO 1: Agrega una columna llamada ID, de tipo INT  IDENTITY(1,1) y llénala con datos. No importa el orden, sólo importa que tengas un identificador único que sirva como clave para acceder a una fila determinada.

    PASO 2: Actualiza tu tabla usando el campo ID:

    UPDATE tuTabla 
    SET fechaBaja = DATEADD(day, 1, fechaAlta)
    WHERE fechaBaja IS NULL
    AND ID NOT IN
       (SELECT ID FROM
           (SELECT ID, 
            ROW_NUMBER() OVER(PARTITION BY NUMERO ORDER BY  FECHAALTA DESC) NUM
            FROM tuTABLA) WHERE NUM=1)

    Saludos,

    Y.


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile


    • Edited by Yván Ecarri Friday, June 01, 2012 10:12 AM Había un error en la consulta
    • Marked as answer by Eder CostaOwner Monday, June 11, 2012 2:25 PM
    Friday, June 01, 2012 10:10 AM

All replies

  • La explicación del proceso no concuerda con los resultados que dices que necesitas, o al menos yo no lo he entendido así. Según los resultados parece que buscas el que la "fechabaja" del registro sea igual al de la "fechaalta" sumándole un día para los casos en que "fechabaja" sea NULL y exceptuando el último. Si es así, puedes hacer algo como

    UPDATE tuTabla 
    SET fechaBaja = DATEADD(day, 1, fechaAlta)
    WHERE fechaBaja IS NULL
    AND fechaBaja <> (SELECT MAX(fechaAlta) FROM tuTabla)

    Wednesday, May 30, 2012 11:54 AM
  • Muchas Gracias Carlos,

    Lo he probado y perfecto, pero tengo un problema, y es que el campo [número] tiene varios registros duplicados, es decir hay varios 2, varios 4, etc,., y claro, me quedan a null varias fechas del mismo [número]. Ahora me quedaría un segundo paso que es rellenar las fechas de esos registros duplicados dejando a null la fecha mas moderna, de manera que solo me quede un [numero] de cada registro con la fecha a null. Lo he intentado con la funcion EXCEPT y tomando otro campo como referencia [letras], que no se repite, pero no lo consigo.

    ¿Sabes como lo puedo hacer?

    Gracias.

    Un Saludo

    Friday, June 01, 2012 7:10 AM
  • ¿Es SQL Server 2005, 2008, R2 ó 2012? Si es una de estas versiones, puedes usar una función de ventana.

    PASO 1: Agrega una columna llamada ID, de tipo INT  IDENTITY(1,1) y llénala con datos. No importa el orden, sólo importa que tengas un identificador único que sirva como clave para acceder a una fila determinada.

    PASO 2: Actualiza tu tabla usando el campo ID:

    UPDATE tuTabla 
    SET fechaBaja = DATEADD(day, 1, fechaAlta)
    WHERE fechaBaja IS NULL
    AND ID NOT IN
       (SELECT ID FROM
           (SELECT ID, 
            ROW_NUMBER() OVER(PARTITION BY NUMERO ORDER BY  FECHAALTA DESC) NUM
            FROM tuTABLA) WHERE NUM=1)

    Saludos,

    Y.


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile


    • Edited by Yván Ecarri Friday, June 01, 2012 10:12 AM Había un error en la consulta
    • Marked as answer by Eder CostaOwner Monday, June 11, 2012 2:25 PM
    Friday, June 01, 2012 10:10 AM