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

#6 Javier Loria
23/02/2004 - 21:46 | Informe spam
Hola:
No, no repite valores, porque ISNULL se encarga de todos los clientes
que tienen multiples pagos (estos si tendrian multiples filas), y los
clientes que NO tienen pagos, solo tendran una fila, con las columnas de la
Tabla de pagos en Nulo.
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.
Maximiliano D. A. <maxi_accotto[arroba]speedy[.]com[.]ar> escribio:
Javier, sabes que veo en tu consulta? que si hay mas de un pago por
Cliente empezara a repetir valores verdad? ;-)


"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
#7 Javier Loria
23/02/2004 - 21:47 | Informe spam
Hola Fernando:
Me alegro te sirviera.

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:
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
#8 Maximiliano D. A.
23/02/2004 - 21:49 | Informe spam
Tenes toda la Rzon, no se que coño vi jeje ;-) debe ser el vino del fin de
semana que no me deja ver bien :-D


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:Oy0Oc4k%
Hola:
No, no repite valores, porque ISNULL se encarga de todos los clientes
que tienen multiples pagos (estos si tendrian multiples filas), y los
clientes que NO tienen pagos, solo tendran una fila, con las columnas de


la
Tabla de pagos en Nulo.
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.
Maximiliano D. A. <maxi_accotto[arroba]speedy[.]com[.]ar> escribio:
> Javier, sabes que veo en tu consulta? que si hay mas de un pago por
> Cliente empezara a repetir valores verdad? ;-)
>
>
> "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







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
#9 Eleonor
24/02/2004 - 19:41 | Informe spam
Y cuidado con los clientes nuevos! No sea cosa de que les queres cobrar períodos en los que aún no eran clientes
Te lo digo por experiencia

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