consulta anidada

23/02/2004 - 15:17 por Fernando Ugarte | Informe spam
hola
no puedo hacer una consulta anidada y necesito ayuda
el caso es que tengo una tabla de clientes y otra de pagos y necesito hacer
la consulta de todos los clientes que no haya realizado pagos en los ultimos
tres meses?
la tabla de pagos tiene
idcliente
mes_pago
año_pago
y la de clientes
tiene idcliente, estado , ...
gracias

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
23/02/2004 - 15:23 | Informe spam
Hola!!

una opcion

Select cliente.idcliente,cliente.estado FROM clientes LEFT Join (
Select max(idcliente) as cliente FROM pagos where (condicion de fechas))
PAGOS
ON
clientes.idcliente = pagos.idcliente
where pagos.idcliente is null


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Fernando Ugarte" escribió en el mensaje
news:O650Beh%
hola
no puedo hacer una consulta anidada y necesito ayuda
el caso es que tengo una tabla de clientes y otra de pagos y necesito


hacer
la consulta de todos los clientes que no haya realizado pagos en los


ultimos
tres meses?
la tabla de pagos tiene
idcliente
mes_pago
año_pago
y la de clientes
tiene idcliente, estado , ...
gracias







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.581 / Virus Database: 368 - Release Date: 09/02/2004
Respuesta Responder a este mensaje
#2 Javier Loria
23/02/2004 - 16:07 | Informe spam
Hola Fernando:
Aun cuando la consulta anidada es mas legible es posible que te de
problemas de rendimiento si los movimientos son muchos. Prueba con:
==SELECT Clientes.IdCliente,
FROM Clientes
LEFT JOIN
(SELECT IdCliente
FROM Pagos
WHERE Fecha BETWEEN DATEADD(dd, -90,GETDATE())
AND GETDATE()
) AS PagosTrimestre
ON
Clientes.IdCliente=PagosTrimestre.IdCliente
WHERE PagosTrimestre.IdCliente IS NULL
==Hay varias tecnicas combinadas:
a) Se construye en un SELECT interno una "tabla virtual" con los pagos
de los ultimos 3 meses.
b) Se hace un LEFT JOIN para que se incluyan los clientes que han hecho
pagos y los que no han hecho pagos. Los que no han hecho pagos tienen las
columnas de la segunda tabla en NULL.
c) En el WHERE se eliminan todos los clientes que han hecho pagos, con
la conndicon es NULL.
Esta consulta aun cuando es mas compleja que la consulta anidada es
MUCHO mas rapida, cuando hay muchos clientes/pagos.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Fernando Ugarte escribio:
hola
no puedo hacer una consulta anidada y necesito ayuda
el caso es que tengo una tabla de clientes y otra de pagos y necesito
hacer la consulta de todos los clientes que no haya realizado pagos
en los ultimos tres meses?
la tabla de pagos tiene
idcliente
mes_pago
año_pago
y la de clientes
tiene idcliente, estado , ...
gracias
Respuesta Responder a este mensaje
#3 Maximiliano D. A.
23/02/2004 - 16:11 | Informe spam
Javier, sabes que veo en tu consulta? que si hay mas de un pago por Cliente
empezara a repetir valores verdad? ;-)


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Javier Loria" escribió en el mensaje
news:eLxJ46h%
Hola Fernando:
Aun cuando la consulta anidada es mas legible es posible que te de
problemas de rendimiento si los movimientos son muchos. Prueba con:
==> SELECT Clientes.IdCliente,
FROM Clientes
LEFT JOIN
(SELECT IdCliente
FROM Pagos
WHERE Fecha BETWEEN DATEADD(dd, -90,GETDATE())
AND GETDATE()
) AS PagosTrimestre
ON
Clientes.IdCliente=PagosTrimestre.IdCliente
WHERE PagosTrimestre.IdCliente IS NULL
==> Hay varias tecnicas combinadas:
a) Se construye en un SELECT interno una "tabla virtual" con los pagos
de los ultimos 3 meses.
b) Se hace un LEFT JOIN para que se incluyan los clientes que han


hecho
pagos y los que no han hecho pagos. Los que no han hecho pagos tienen las
columnas de la segunda tabla en NULL.
c) En el WHERE se eliminan todos los clientes que han hecho pagos, con
la conndicon es NULL.
Esta consulta aun cuando es mas compleja que la consulta anidada es
MUCHO mas rapida, cuando hay muchos clientes/pagos.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Fernando Ugarte escribio:
> hola
> no puedo hacer una consulta anidada y necesito ayuda
> el caso es que tengo una tabla de clientes y otra de pagos y necesito
> hacer la consulta de todos los clientes que no haya realizado pagos
> en los ultimos tres meses?
> la tabla de pagos tiene
> idcliente
> mes_pago
> año_pago
> y la de clientes
> tiene idcliente, estado , ...
> gracias







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.581 / Virus Database: 368 - Release Date: 09/02/2004
Respuesta Responder a este mensaje
#4 Fernando Ugarte
23/02/2004 - 16:36 | Informe spam
si, la verdad es que me aparecen 120.000 casos cuando debieran ser 30000
lo solucione de la sig manera, espero que este bien, y muchas gracias por
sus aportes
ss_mssp es la de clientes y mgob la de pagos

SELECT *
FROM dbo.ss_mssp
WHERE (estado <> 'INA') AND (NOT EXISTS
(SELECT DISTINCT ndoc
FROM ss_mgob
WHERE ss_mgob.ndoc = ss_mssp.ndoc)) AND
(ID_miembro = '00')


"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:egjMw%23h%
Javier, sabes que veo en tu consulta? que si hay mas de un pago por


Cliente
empezara a repetir valores verdad? ;-)


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Javier Loria" escribió en el mensaje
news:eLxJ46h%
> Hola Fernando:
> Aun cuando la consulta anidada es mas legible es posible que te de
> problemas de rendimiento si los movimientos son muchos. Prueba con:
> ==> > SELECT Clientes.IdCliente,
> FROM Clientes
> LEFT JOIN
> (SELECT IdCliente
> FROM Pagos
> WHERE Fecha BETWEEN DATEADD(dd, -90,GETDATE())
> AND GETDATE()
> ) AS PagosTrimestre
> ON
> Clientes.IdCliente=PagosTrimestre.IdCliente
> WHERE PagosTrimestre.IdCliente IS NULL
> ==> > Hay varias tecnicas combinadas:
> a) Se construye en un SELECT interno una "tabla virtual" con los


pagos
> de los ultimos 3 meses.
> b) Se hace un LEFT JOIN para que se incluyan los clientes que han
hecho
> pagos y los que no han hecho pagos. Los que no han hecho pagos tienen


las
> columnas de la segunda tabla en NULL.
> c) En el WHERE se eliminan todos los clientes que han hecho pagos,


con
> la conndicon es NULL.
> Esta consulta aun cuando es mas compleja que la consulta anidada es
> MUCHO mas rapida, cuando hay muchos clientes/pagos.
> Saludos,
>
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda.
>
> Fernando Ugarte escribio:
> > hola
> > no puedo hacer una consulta anidada y necesito ayuda
> > el caso es que tengo una tabla de clientes y otra de pagos y necesito
> > hacer la consulta de todos los clientes que no haya realizado pagos
> > en los ultimos tres meses?
> > la tabla de pagos tiene
> > idcliente
> > mes_pago
> > año_pago
> > y la de clientes
> > tiene idcliente, estado , ...
> > gracias
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.581 / Virus Database: 368 - Release Date: 09/02/2004


Respuesta Responder a este mensaje
#5 Fernando Ugarte
23/02/2004 - 16:54 | Informe spam
perdon una aclaracion
la solucion que use no tiene en cuenta los ultimos pagos, sino que me da los
clientes que no han hecho ningun pago, porque asi me lo pidieron ahora.

y da el mismo resultado que

SELECT *
FROM ss_mssp LEFT OUTER JOIN
(SELECT ndoc
FROM ss_mgob) PagosTrimestre ON
ss_mssp.ndoc = PagosTrimestre.ndoc
WHERE (PagosTrimestre.ndoc IS NULL) AND (ss_mssp.estado <> 'INA') AND
(ss_mssp.ID_miembro = '00')

"Fernando Ugarte" escribió en el mensaje
news:OFSqVKi%
si, la verdad es que me aparecen 120.000 casos cuando debieran ser 30000
lo solucione de la sig manera, espero que este bien, y muchas gracias por
sus aportes
ss_mssp es la de clientes y mgob la de pagos

SELECT *
FROM dbo.ss_mssp
WHERE (estado <> 'INA') AND (NOT EXISTS
(SELECT DISTINCT ndoc
FROM ss_mgob
WHERE ss_mgob.ndoc = ss_mssp.ndoc)) AND
(ID_miembro = '00')


"Maximiliano D. A." <maxi_accotto[arroba]speedy[.]com[.]ar> escribió en el
mensaje news:egjMw%23h%
> Javier, sabes que veo en tu consulta? que si hay mas de un pago por
Cliente
> empezara a repetir valores verdad? ;-)
>
>
> Salu2
> Maxi
> Buenos Aires Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> [Maxi_accotto[arroba]speedy[punto]com[punto]ar
> MSN:
>
>
> "Javier Loria" escribió en el mensaje
> news:eLxJ46h%
> > Hola Fernando:
> > Aun cuando la consulta anidada es mas legible es posible que te de
> > problemas de rendimiento si los movimientos son muchos. Prueba con:
> > ==> > > SELECT Clientes.IdCliente,
> > FROM Clientes
> > LEFT JOIN
> > (SELECT IdCliente
> > FROM Pagos
> > WHERE Fecha BETWEEN DATEADD(dd, -90,GETDATE())
> > AND GETDATE()
> > ) AS PagosTrimestre
> > ON
> > Clientes.IdCliente=PagosTrimestre.IdCliente
> > WHERE PagosTrimestre.IdCliente IS NULL
> > ==> > > Hay varias tecnicas combinadas:
> > a) Se construye en un SELECT interno una "tabla virtual" con los
pagos
> > de los ultimos 3 meses.
> > b) Se hace un LEFT JOIN para que se incluyan los clientes que han
> hecho
> > pagos y los que no han hecho pagos. Los que no han hecho pagos tienen
las
> > columnas de la segunda tabla en NULL.
> > c) En el WHERE se eliminan todos los clientes que han hecho pagos,
con
> > la conndicon es NULL.
> > Esta consulta aun cuando es mas compleja que la consulta anidada


es
> > MUCHO mas rapida, cuando hay muchos clientes/pagos.
> > Saludos,
> >
> >
> > Javier Loria
> > Costa Rica
> > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > que pueda ser copiado y pegado al Query Analizer.
> > La version de SQL y Service Pack tambien ayuda.
> >
> > Fernando Ugarte escribio:
> > > hola
> > > no puedo hacer una consulta anidada y necesito ayuda
> > > el caso es que tengo una tabla de clientes y otra de pagos y


necesito
> > > hacer la consulta de todos los clientes que no haya realizado pagos
> > > en los ultimos tres meses?
> > > la tabla de pagos tiene
> > > idcliente
> > > mes_pago
> > > año_pago
> > > y la de clientes
> > > tiene idcliente, estado , ...
> > > gracias
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.581 / Virus Database: 368 - Release Date: 09/02/2004
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida