Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Resultado con exists dudoso (https://www.clubdelphi.com/foros/showthread.php?t=67246)

sierraja 07-04-2010 16:08:56

Resultado con exists dudoso
 
Buenos dias, tengo el siguiente escenario:

Código:

Tabla Vendedores:
 
NOMBRE VENDEDOR
juan
pedro
jose
andres
jaime
 
Tabla de Ventas
 
VENDEDOR/FECHA
juan/12/12/2009
pedro/01/12/2009
andres/02/12/2009

El resultado que se quiere obtener es: el nombre de los vendedores que no tuvieron ventas en el mes 12, es decir la consulta arrojaria los nombres de jaime y jose. De antemano muchas gracias por su atencion.

ContraVeneno 07-04-2010 16:34:53

Código SQL [-]
Select V.Nombre
From Vendedores V
full outer join Ventas T on V.Nombre = T.Nombre
where T.Nombre is null

Caro 07-04-2010 16:46:19

Hola sierraja, puedes hacerlo con Left Join, no dices la BD que usas.

Código SQL [-]
Select V.* From Vendedor V
Left Join (Select Codigo_Vendedor 
           From Ventas 
           Where Extract(Month From Fecha)='12') Vtas On (V.Codigo=Vtas.Codigo_Vendedor)
Where Vtas.Codigo_Vendedor is null
 
//Extract es de Firebird

Saluditos

sierraja 07-04-2010 17:00:35

Gracias por tu atencion. Necesito hacer una correcion sobre la tabla de ventas

Código:

Tabla de Ventas
 
VENDEDOR/FECHA
juan/12/12/2009
pedro/01/12/2009
andres/02/12/2009
juan/12/11/2009
pedro/01/11/2009
andres/02/11/2009
jaime/01/11/2009
jose/01/11/2009


sierraja 07-04-2010 17:10:01

Es correcto, estoy utilizando firebird. Gracias por tu atencion:D

Caro 07-04-2010 17:12:28

Cita:

Empezado por sierraja (Mensaje 359626)
Gracias por tu atencion. Necesito hacer una correcion sobre la tabla de ventas

Hola de nuevo, ¿has hecho la prueba de la consulta que puse?, debería funcionarte aún con la corrección de la tabla que pusiste.

Saluditos

sierraja 07-04-2010 17:21:53

Es correcto, hice la prueba que me indicaste, pero se me queda colgada la maquina :confused:

sierraja 07-04-2010 17:24:21

Hola, tenia un error en la sintaxis. Pero ahora tengo otro error y lo genera en el segundo select, es decir despues del join left y me dice que hay error sistaxis.

Caro 07-04-2010 17:26:38

Cita:

Empezado por sierraja (Mensaje 359636)
Hola, tenia un error en la sintaxis. Pero ahora tengo otro error y lo genera en el segundo select, es decir despues del join left y me dice que hay error sistaxis.

Hola de nuevo, puedes pegar aquí la consulta que estas ejecutando con los campos que supongo has reemplazado.

Saluditos

sierraja 07-04-2010 17:28:44

Ok Gracias. La consulta es:


Código SQL [-]select *
from direccion_operacional d
left join (select codigo_suscriptor
from facturacion f
where Extract(Month From Fecha)='12') f on (d.codigo_do=f.codigo_suscriptor)
where f.codigo_suscriptor is null;

sierraja 07-04-2010 17:30:11

Perdon por el error:

Código SQL [-]
 
select *
from direccion_operacional d
left join (select codigo_suscriptor
           from facturacion f
           where Extract(Month From Fecha)='12') f on (d.codigo_do=f.codigo_suscriptor)
where f.codigo_suscriptor is null;

Disculpa

Caro 07-04-2010 17:43:43

Hola, lo unico que veo es que le estas asignando el mismo alias tanto para el select interior como para el resultado que da ese select, has la prueba quitando el alias que has puesto en el select interior, también puedes probar ejecutando solo la segunda consulta, para saber si ahí esta el problema.

Saluditos

sierraja 07-04-2010 17:51:14

He intentado la consulta interior y genera un error en el alias despues del where es decir


Código SQL [-]
 
select codigo_suscriptor
           from facturacion f
           where Extract(Month From Fecha)='12') f on (d.codigo_do=f.codigo_suscriptor);

Caro 07-04-2010 17:59:32

Hola de nuevo, la consulta interior es solo esta:

Código SQL [-]
select codigo_suscriptor
from facturacion
where Extract(Month From Fecha)='12'

también te decía que pruebes quitando el alias de la consulta interior, pero no debería dar problemas, así como esta porque es solo una tabla.

Código SQL [-]
select *
from direccion_operacional d
left join (select codigo_suscriptor
           from facturacion
           where Extract(Month From Fecha)='12') f on (d.codigo_do=f.codigo_suscriptor)
where f.codigo_suscriptor is null;

Acabo de hacer la prueba, aplicando a mis tablas y la consulta que te puse si funciona.

Saluditos

rgstuamigo 07-04-2010 22:34:26

A mí me parece mas fácil hacerlo de ésta manera:
Código SQL [-]
Select V.Nombre
From Vendedores V
LEFT OUTER JOIN Ventas T 
ON V.Nombre=T.Vendedor
WHERE T.Vendedor is null 
and Extract(Month from T.Fecha)=12
.
Recomendación:

Algo muy importante para poder hacer estos tipos de consulta es conocer los diferentes JOIN y poder utilizarlo en diferentes consultas, para lo cual recomiendo leer muy atentamente ésta página(o tambien ésta) que nos va llevar a entender muy bien estos tipos de consulta y nos va fascilitar la vida.;).
Saludos...:)


La franja horaria es GMT +2. Ahora son las 17:32:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi