[OT] Duda sobre SQL

27/11/2006 - 13:33 por meular | Informe spam
Buenos días,

Tengo un duda que me trae de cabeza y os la expongo a ver si alguien me
puede aportar un poco luz.

Tengo dos tablas, una de pagos y otra con el desglose de los mismos. En
resumen la estructura es esta:

PAGO
idpago, totalpago

DETALLE_PAGO
idlineapago, idpago, subtotalpago

Lo que quiero comprobar es que los "totalpago" coincidan con la suma de su
detalle. Si no coinciden quiero que me devuelva su "id". Es decir,

PAGO
==idpago: 1
totalpago: 200
idpago 2
totalapago: 100

DETALLE_PAGO
==idlineapago: 1
idpago: 1
subtotal: 100
idlineapago: 3
idpago: 2
subtotal: 100

idlineapago: 3
idpago: 2
subtotal: 50

En este caso quiero conseguir el registro "2".

¿Hay alguna forma de realizar esta verificación con una única SQL? Me
imagino que sí pero no he conseguido quitarla. La única forma forma soy
capaz de conseguirlo es mediante un procedimiento que haga dos consultas.
Una que coja un idpago y otra que consulte su detalle y que sume los
subtotales. Pero la verdad es que tengo "la espinita" clavada y me gustaría
saber si se puede hacer de otra forma.


Espero haberme explicado correctamente.

Gracias y un saludo.

meular

Preguntas similare

Leer las respuestas

#1 jcac
27/11/2006 - 14:01 | Informe spam
Aqui puedes probar estos resultado y ver su comportamiento.

Create Table #Tmp (idpago int, idtotal int)
Insert into #tmp values (1, 200)
Insert into #tmp values (2, 100)
Create Table #Tmp1 (idlineapago int, idpago int, subtotalpago int)
Insert into #Tmp1 values (1, 1, 100)
Insert into #Tmp1 values (2, 2, 100)
Insert into #Tmp1 values (3, 2, 50)
go

Select t1.idpago, t1.idtotal, sum(t2.subtotalpago) as subtotalpago
From #tmp t1 inner join #tmp1 t2 on t1.idpago=t2.idpago
Group by t1.idpago, t1.idtotal
go

Select t1.idpago, t1.idtotal - sum(t2.subtotalpago) as diferencia
From #tmp t1 inner join #tmp1 t2 on t1.idpago=t2.idpago
Group by t1.idpago, t1.idtotal
Order by t1.idpago
go

Insert into #Tmp1 values (4, 1, 100)
Select t1.idpago, t1.idtotal - sum(t2.subtotalpago) as diferencia
From #tmp t1 inner join #tmp1 t2 on t1.idpago=t2.idpago
Group by t1.idpago, t1.idtotal
Having t1.idtotal - sum(t2.subtotalpago) <> 0
Order by t1.idpago
go

Saludos y suerte


"meular" escribió en el mensaje
news:
Buenos días,

Tengo un duda que me trae de cabeza y os la expongo a ver si alguien me
puede aportar un poco luz.

Tengo dos tablas, una de pagos y otra con el desglose de los mismos. En
resumen la estructura es esta:

PAGO
idpago, totalpago

DETALLE_PAGO
idlineapago, idpago, subtotalpago

Lo que quiero comprobar es que los "totalpago" coincidan con la suma de su
detalle. Si no coinciden quiero que me devuelva su "id". Es decir,

PAGO
==> idpago: 1
totalpago: 200
idpago 2
totalapago: 100

DETALLE_PAGO
==> idlineapago: 1
idpago: 1
subtotal: 100
idlineapago: 3
idpago: 2
subtotal: 100

idlineapago: 3
idpago: 2
subtotal: 50

En este caso quiero conseguir el registro "2".

¿Hay alguna forma de realizar esta verificación con una única SQL? Me
imagino que sí pero no he conseguido quitarla. La única forma forma soy
capaz de conseguirlo es mediante un procedimiento que haga dos consultas.
Una que coja un idpago y otra que consulte su detalle y que sume los
subtotales. Pero la verdad es que tengo "la espinita" clavada y me
gustaría saber si se puede hacer de otra forma.


Espero haberme explicado correctamente.

Gracias y un saludo.

meular



Respuesta Responder a este mensaje
#2 Toni Recio
27/11/2006 - 14:27 | Informe spam
Yo haría la "trampa" de crear una Vista como la siguiente:

SELECT
dbo.PAGO.idpago,
MAX(dbo.PAGO.idtotal) AS TotalCabecera,
SUM(dbo.DETALLE_PAGO.subtotalpago) AS TotalDetalle
FROM dbo.DETALLE_PAGO
LEFT OUTER JOIN dbo.DETALLE_PAGO ON
dbo.PAGO.idpago = dbo.DETALLE_PAGO.idpago
GROUP BY dbo.PAGO.idpago

De éste modo con un simple select que compare los campos "TotalCabecera" y
"TotalDetalle" ya sería suficiente.

Seguramente no es ésto lo que preguntabas, pero es a lo máximo que llego un
lunes... ;-)

Un saludo,
Toni Recio
http://www.tonirecio.com
"meular" wrote:

Buenos días,

Tengo un duda que me trae de cabeza y os la expongo a ver si alguien me
puede aportar un poco luz.

Tengo dos tablas, una de pagos y otra con el desglose de los mismos. En
resumen la estructura es esta:

PAGO
idpago, totalpago

DETALLE_PAGO
idlineapago, idpago, subtotalpago

Lo que quiero comprobar es que los "totalpago" coincidan con la suma de su
detalle. Si no coinciden quiero que me devuelva su "id". Es decir,

PAGO
==> idpago: 1
totalpago: 200
idpago 2
totalapago: 100

DETALLE_PAGO
==> idlineapago: 1
idpago: 1
subtotal: 100
idlineapago: 3
idpago: 2
subtotal: 100

idlineapago: 3
idpago: 2
subtotal: 50

En este caso quiero conseguir el registro "2".

¿Hay alguna forma de realizar esta verificación con una única SQL? Me
imagino que sí pero no he conseguido quitarla. La única forma forma soy
capaz de conseguirlo es mediante un procedimiento que haga dos consultas.
Una que coja un idpago y otra que consulte su detalle y que sume los
subtotales. Pero la verdad es que tengo "la espinita" clavada y me gustaría
saber si se puede hacer de otra forma.


Espero haberme explicado correctamente.

Gracias y un saludo.

meular




Respuesta Responder a este mensaje
#3 meular
27/11/2006 - 16:16 | Informe spam
Gracias a los dos por vuestras respuestas y el tiempo que le habéis
dedicado.

Un saludo.

meular.



"meular" escribió en el mensaje
news:
Buenos días,

Tengo un duda que me trae de cabeza y os la expongo a ver si alguien me
puede aportar un poco luz.

Tengo dos tablas, una de pagos y otra con el desglose de los mismos. En
resumen la estructura es esta:

PAGO
idpago, totalpago

DETALLE_PAGO
idlineapago, idpago, subtotalpago

Lo que quiero comprobar es que los "totalpago" coincidan con la suma de su
detalle. Si no coinciden quiero que me devuelva su "id". Es decir,

PAGO
==> idpago: 1
totalpago: 200
idpago 2
totalapago: 100

DETALLE_PAGO
==> idlineapago: 1
idpago: 1
subtotal: 100
idlineapago: 3
idpago: 2
subtotal: 100

idlineapago: 3
idpago: 2
subtotal: 50

En este caso quiero conseguir el registro "2".

¿Hay alguna forma de realizar esta verificación con una única SQL? Me
imagino que sí pero no he conseguido quitarla. La única forma forma soy
capaz de conseguirlo es mediante un procedimiento que haga dos consultas.
Una que coja un idpago y otra que consulte su detalle y que sume los
subtotales. Pero la verdad es que tengo "la espinita" clavada y me
gustaría saber si se puede hacer de otra forma.


Espero haberme explicado correctamente.

Gracias y un saludo.

meular



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida