SQL - Copiar registro anterior a registros vacíos

 
Vista:
sin imagen de perfil

Copiar registro anterior a registros vacíos

Publicado por Jesus Sant (1 intervención) el 20/09/2016 03:52:34
Hola, que tal!
Espero pueden ayudarme con este problema que estoy teniendo y que hasta el momento no he encontrado solucion
Lo que estoy deseando hacer es rellenar los espacios vacios(Nulos) con el valor de la oficina de arriba de ellos pero no he logrado realizarlo aun.
Este es el resultado actual al realizar la consulta
Captura-de-pantalla-419

y este seria el resultado deseado.

Captura-de-pantalla-422

Agradezco anticipadamente su apoyo
Saludos!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 302
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Copiar registro anterior a registros vacíos

Publicado por Rafael (111 intervenciones) el 20/09/2016 11:23:45
El problema que veo es que tu información no cuenta con un orden especifico.

Tampoco indicas que versión de SQL Server estas utilizando ... por lo que quizás lo que te proponga no funcione, aun así intentemos esto:

existe una función analítica llamada LAG que te muestra el registro previo...

Así pues podrías probar con algo similar a esto:
1
2
3
4
5
6
7
8
9
SELECT TOP 1000
       CASE WHEN OFICINA IS NULL THEN
		    LAG(OFICINA) OVER ()
	   ELSE OFICINA END AS OFICINA
     , CUENTA
	 , DESCRIPCION
	 , SALDO
	 , MONEDA
FROM   [master].[dbo].CTAS_PUENTES

Aunque a mi entender deberías establecer un criterio de ordenación y quizás este seria la cuenta...
1
2
3
4
5
6
7
8
9
SELECT TOP 1000
       CASE WHEN OFICINA IS NULL THEN
		    LAG(OFICINA) OVER (ORDER BY CUENTA)
	   ELSE OFICINA END AS OFICINA
     , CUENTA
	 , DESCRIPCION
	 , SALDO
	 , MONEDA
FROM   [master].[dbo].CTAS_PUENTES


Otra cosa es por que esta en master??? esa base de datos no es común que se le metan cosas ... deberías crear otra base de datos...

Saludos
Pd. Si te sirve la información a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 1.988
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Copiar registro anterior a registros vacíos

Publicado por Isaias (1462 intervenciones) el 22/09/2016 00:06:22
Excelente observacion, lo de la base MASTER

Segun alcanzo a ver en el MANAGEMENTE STUDIO es un 10.50.1600, o sea un SQL SERVER 2008 R2, por lo que deduzco que esta en RTM (sin service pack)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Copiar registro anterior a registros vacíos

Publicado por Elga (1 intervención) el 22/10/2019 17:59:52
Hola, esa consulta no arroja el resultado deseado. No llena todos los campos en campo blanco con el valor anterior.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 101
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Copiar registro anterior a registros vacíos

Publicado por Francisco (33 intervenciones) el 22/10/2019 19:33:05
Hola

Esto se resuelve usando un cursor, claro tiene un punto debil asumiendo que el primer registro o los siguientes sean NULL en cuenta no se va actualizar.


Lo puedes probar aqui:

https://rextester.com/XUJUSE95171


Aqui dejo el codigo;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-- DROP TABLE cuentas;
CREATE TABLE cuentas(
    id INT PRIMARY KEY,
    cuenta INT
    );
 
INSERT INTO cuentas VALUES (1,500);
INSERT INTO cuentas VALUES (2,NULL);
INSERT INTO cuentas VALUES (3,600);
INSERT INTO cuentas VALUES (4,600);
INSERT INTO cuentas VALUES (5,NULL);
INSERT INTO cuentas VALUES (6,700);
INSERT INTO cuentas VALUES (7,700);
INSERT INTO cuentas VALUES (8,700);
INSERT INTO cuentas VALUES (9,NULL);
INSERT INTO cuentas VALUES (10,NULL);
INSERT INTO cuentas VALUES (11,800);
INSERT INTO cuentas VALUES (12,900);
INSERT INTO cuentas VALUES (13,NULL);
INSERT INTO cuentas VALUES (14,9999);
 
SELECT * FROM cuentas;
 
DECLARE @cuenta int;
DECLARE @old_cuenta int;
 
DECLARE db_cursor CURSOR
    FOR SELECT cuenta FROM cuentas
    FOR UPDATE OF cuenta;
 
OPEN db_cursor
    FETCH NEXT FROM db_cursor INTO @cuenta;
 
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @cuenta IS NULL
        UPDATE cuentas
            SET cuenta = @old_cuenta
        WHERE CURRENT OF db_cursor;
    ELSE
        SET @old_cuenta = @cuenta;
 
    FETCH NEXT FROM db_cursor INTO @cuenta;
END
 
CLOSE db_cursor
DEALLOCATE db_cursor
 
SELECT * FROM cuentas;
 
DROP TABLE cuentas

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar