SQL - Eliminar filas con registros = en distintos campos

 
Vista:

Eliminar filas con registros = en distintos campos

Publicado por Javi (1 intervención) el 11/07/2007 12:14:20
Muy buenos dias, a ver si me pueden ayudar, la idea es la siguiente: tengo la siguiente tabla:

FECHA ASIENTO CUENTA CONCEPTO DEBE HABER
01/01/06 1 43000001 SALDO APERTURA 150 0
15/01/06 6 43000001 FRA.Nº1 25 0
20/02/06 8 43000001 COBRO FRA.Nº 985 0 30
30/03/06 15 43000001 FRA.Nº18 55 0
25/07/06 24 43000001 COBRO FRA.Nº 15 0 25
28/09/06 57 43000001 FRA.Nº22 27 0
31/12/06 80 43000001 COBRO FRA.Nº18 0 55

el Saldo de la Cuenta (DEBE-HABER) que arroja esa tabla es 147, y la idea es crear una consulta (en sql para access2003) que nos haga una composición del saldo de dicha cuenta, de tal manera nos devuelva los siguientes registros:

FECHA ASIENTO CUENTA CONCEPTO DEBE HABER
01/01/06 1 43000001 SALDO APERTURA 150 0
20/02/06 8 43000001 COBRO FRA.Nº 985 0 30
28/09/06 57 43000001 FRA.Nº22 27 0

Es decir, que haya eliminado las filas donde el importe ya sea del DEBE o del HABER sean iguales.

Muchisimas gracias y un saludo.
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

RE:Eliminar filas con registros = en distintos cam

Publicado por lmorilla (11 intervenciones) el 11/07/2007 15:25:59
SELECT fecha, asiento, cuenta, concepto, debe, haber
FROM nombre_de_tu_tabla
WHERE debe NOT IN (SELECT haber
FROM nombre_de_tu_tabla)

no se si es a esto a lo que te refieres, si tienes que llevar el control con lo anterior tendrías que añadir en la subselect AND asiento < asiento y deberás poner seudónimos a la tabla de la select principal para que lo reconozca, y en la subselect sería nombre_de_tu_tabla.asiento < seudónimo.asiento

En caso de necesitar más controles u otras casuísticas, siempre podrás recorrer la tabla como el ejemplo a continuación, agregando todo lo que quieras al IF.

DECLARE @var_fecha DATE
DECLARE @var_asiento INT(5)
DECLARE @var_cuenta INT(8)
DECLARE @var_concepto VARCHAR(50)
DECLARE @var_debe DECIMAL(12,2)
DECLARE @var_haber DECIMAL(12,2)

DECLARE nombre_cursor CURSOR FOR
(SELECT fecha, asiento, cuenta, concepto, debe, haber
FROM nombre_de_tu_tabla)

OPEN nombre_cursor
FETCH NEXT FROM nombre_cursor
INTO @var_fecha, @var_asiento, @var_cuenta, @var_concepto, @var_debe, @var_haber
WHILE @@FETCH_STATUS = 0
BEGIN

IF @var_debe NOT IN (SELECT haber FROM nombre_de_tu_tabla)
PRINT CAST(@var_fecha AS VARCHAR(10)) + ' ' + CAST(@var_asiento AS VARCHAR(5))
+ ' ' + CAST(@var_cuenta AS VARCHAR(8)) + ' ' + @var_concepto + ' '
+ CAST(@var_debe AS VARCHAR (12)) + ' ' + CAST(@var_haber AS VARCHAR(12))

FETCH NEXT FROM nombre_cursor
INTO @var_fecha, @var_asiento, @var_cuenta, @var_concepto, @var_debe, @var_haber
END
CLOSE nombre_cursor
DEALLOCATE nombre_cursor
GO
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

RE:Eliminar filas con registros = en distintos cam

Publicado por Isaias (5072 intervenciones) el 11/07/2007 20:20:41
Yo creo que hay operaciones que deberia hacerlas la capa front, esta, es una de esas.
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

RE:Eliminar filas con registros = en distintos cam

Publicado por Javi (3 intervenciones) el 12/07/2007 21:27:36
Eureka, añadiéndole a la select la parte que viene después del OR me funciona de maravilla

SELECT fecha, asiento, cuenta, concepto, debe, haber
FROM nombre_de_tu_tabla
WHERE debe NOT IN (SELECT haber
FROM nombre_de_tu_tabla) OR haber NOT IN (SELECT debe FROM nombre_de_tu_tabla)

Muchísimas gracias y eternamente agradecido.

Javi
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

RE:Eliminar filas con registros = en distintos cam

Publicado por Javi (3 intervenciones) el 13/07/2007 15:03:37
Creía que me funcionaba pero me he dado cuenta que si en el haber hay 2 registros iguales y estos son iguales a 1 registro en el debe la consulta me elimina los 3 registros cuando lo que necesito es que me elimine las filas de un registro en el debe con uno solo coincidente en el haber. Es decir, si tengo esta tabla:

FECHA ASIENTO CUENTA DESCRIPCION DEBE HABER
01-ene-06 0 430019082 Apertura Ejercicio 2006 55 0
02-ene-06 1 14675 430019082 Ntra.Fra.Num.: 75 10 0
03-ene-06 1 189118 430019082 Ntra.Fra.Num.: 118 15 0
03-ene-06 1 15252 430019082 Cobro Fra. 75 0 10
03-ene-06 1 15252 430019082 Cobro Fra. 118 0 10
07-ene-06 1 489418 430019082 Ntra.Fra.Num.: 418 20 0

y la consulto así:

SELECT *
FROM NOMBRETABLA
WHERE DEBE NOT IN (SELECT HABER
FROM NOMBRETABLA) OR HABER NOT IN (SELECT DEBE FROM NOMBRETABLA);

Me devuelve los siguientes datos:

FECHA ASIENTO CUENTA DESCRIPCION DEBE HABER
01-ene-06 0 430019082 Apertura Ejercicio 2006 55 0
03-ene-06 1 189118 430019082 Ntra.Fra.Num.: 118 15 0
07-ene-06 1 489418 430019082 Ntra.Fra.Num.: 418 20 0

Me ha eliminado 3 registros, 2 del haber con el importe de 10 y uno en el debe con el mismo importe. Y lo que necesito es que me elimine solo 2 registros, 1 del debe y otro del haber con el mismo importe de 10.

Nota: puede que hayan 2 o mas filas con el mismo nº de asiento, misma fecha, y mismo importe en el debe y/o en el haber.

Si me pueden ayudar se lo agradecería infinitamente,

Muchisimas gracias
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