Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Select a 2 tablas (https://www.clubdelphi.com/foros/showthread.php?t=81411)

jars 12-11-2012 16:09:40

Select a 2 tablas
 
Hola amigos.
Tengo el siguiente problema, en una tabla tengo registros de todas las llamadas recibidas (A) y en otra tabla tengo los registros de las llamadas que fueron atendidas por alguna persona (B). Esto es que muchas llamadas no fueron atendidas por alguien porque estaban todos ocupados.
Lo que tengo que hacer es armar una consulta que me traiga todas las llamadas (A) y los datos de quines la atendieron de (B) que como dije muchas de (A) no tienen un registro en (B). Hay un campo que es comun en ambas tablas (CallReference)y es univoco y seria este el que las relaciona. Actualmente lo que hago es extraer de (A) los registros del rango de fechas que solicita el cliente y una vez obtenido, hago el open y lo recorro de a un registro buscando el CallReference de (A) en (B), si lo encuentra tomo los datros y sino quedan en blanco. Se puede hacer todo esto con un solo Select? porque me tarda mucho tiempo.
Gracias.

cloayza 12-11-2012 16:25:12

Bueno al parecer tu debilidad es el lenguaje SQL...


Código SQL [-]
SELECT Llamadas.*, Atendieron.*
FROM Llamadas
LEFT OUTER JOIN Atendieron  ON (Llamadas. CallReference = Atendieron. CallReference);

Cita:

Llamadas.* te traera todos los campos de la tabla llamadas al igual que Atendieron.*, es preferible que indiques los campos que requieres
Saludos...

jars 12-11-2012 16:29:00

Gracias CLOAYZA, y si tienes razon, me falta mucho con SQL.
Un abrazo.

jars 12-11-2012 16:45:27

UUUUPPPS!!!!!
Arme esta consulta pero no me respeta lo que hay en la clausula where:

Código SQL [-]
SELECT a.logdate, a.logtime, a.node, a.channel, a.phone, a.lengthcall, a.calltype, a.campaign, a.taxid,
b.posnumber, b.agentid, b.skill
FROM LOGCALL a LEFT OUTER JOIN logpos b on (a.callrefid = b.callrefid)
where a.logdate = '20120702'
and (a.CALLTYPE = 'I')
OR ((a.CALLTYPE = 'O') AND (a.RESULT IN ('10','18','1004'))
AND (a.PHONE <> ''))

ElDioni 12-11-2012 17:01:10

Puede que hayas agrupado mal las comparaciones en los parentesis y por eso no te de el resultado deseado.

Según lo que has puesto si elimino los parentesis que encierran una única comparación me queda algo así:

Código SQL [-]
a.CALLTYPE = 'I' OR (a.CALLTYPE = 'O' AND a.RESULT IN ('10','18','1004') AND a.PHONE <> '')

entonces te mostraría todas las llamadas de tipo "I" o todas las llamadas de tipo "O" cuyo resultado esté en 10,18 y 1004 y el teléfono no esté vacio, tienen que cumplirse las tres condiciones. ¿es eso lo que realmente quieres?, si es así no le veo nada raro.

Saludos.

jars 12-11-2012 17:05:52

Gracias amigos por responder.
La macana la cometi yo, me falto agregar un parentesis que agrupe todo exceptuando la fecha.
Quedaria asi:
Código SQL [-]
SELECT a.logdate, a.logtime, a.node, a.channel, a.phone, a.lengthcall, a.calltype, a.campaign, a.taxid, b.posnumber, b.agentid, b.skill FROM LOGCALL a LEFT OUTER JOIN logpos b on (a.callrefid = b.callrefid) where a.logdate = '20120702' and ((a.CALLTYPE = 'I') OR ((a.CALLTYPE = 'O') AND (a.RESULT IN ('10','18','1004')) AND (a.PHONE <> '')))

Asi funciona en forma correcta.
Mil gracias.

jars 12-11-2012 18:25:26

Otra vez con problemas.
Ahora me encuentro con esta otra condicion que no se como resolver.
Es sobre el mismo query:

Código SQL [-]
SELECT a.callrefid,  a.callrefid1, a.logdate, a.logtime, a.node, a.channel, a.phone, a.lengthcall, a.calltype, a.campaign, a.taxid,
b.posnumber, b.agentid, b.skill
FROM LOGCALL a LEFT OUTER JOIN logpos b on (a.callrefid = b.callrefid)
where a.logdate between '20120701' and '20120707'
and ((a.CALLTYPE = 'I') OR ((a.CALLTYPE = 'O') AND (a.RESULT IN ('10','18','1004')) AND (a.PHONE <> '')))

En el on (a.callrefid = b.callrefid) es donde tengo el problema.
Si a.callrefid1 <> ' ' and a.callrefid1 <> '*' then
on (a.callrefid1 = b.callrefid)
else
on (a.callrefid = b.callrefid)

Tengo que poder poner esa condicion.
Es posible?

ElDioni 13-11-2012 10:44:23

No entiendo que quieres conseguir,

si lo que quieres es eliminar los registros de a donde no estén vacios o sean un * añade esas condiciones al WHERE.

Saludos.

jars 13-11-2012 13:37:19

Hay dos campos callrefid y callrefid1.
callrefid1 generalmente viene en blanco o con un '*', si no es asi quiere decir que hay que tomar ese dato para la condicion del ON

En el on (a.callrefid = b.callrefid) es donde tengo el problema.
Si a.callrefid1 <> ' ' and a.callrefid1 <> '*' then
on (a.callrefid1 = b.callrefid) -- uso callrefid1
else
on (a.callrefid = b.callrefid) -- uso callrefid

olbeup 13-11-2012 14:57:29

Cita:

Empezado por jars (Mensaje 449318)
Hay dos campos callrefid y callrefid1.
callrefid1 generalmente viene en blanco o con un '*', si no es asi quiere decir que hay que tomar ese dato para la condicion del ON

En el on (a.callrefid = b.callrefid) es donde tengo el problema.
Si a.callrefid1 <> ' ' and a.callrefid1 <> '*' then
on (a.callrefid1 = b.callrefid) -- uso callrefid1
else
on (a.callrefid = b.callrefid) -- uso callrefid

Si lo que quieres es enlazar a.callrefid y a.callrefid1 con b.callrefid lo que tienes que hacer es poner otro
Código SQL [-]
    LEFT JOIN LogPos C
      ON C.callrefid1 = B.callrefid
Un saludo

P.D.: Muestra tú SQL más elegante en el futuro, no realices la SQL en una sola línea, si pones los nombre en minúscula pues todos en minúscula tanto en el SELECT como en el WHERE, es incomodo a la hora de leerla.

jars 13-11-2012 15:43:34

Gracias OLBEUP por el aporte y los concejos.
Abrazo

jars 13-11-2012 17:46:25

Lamentablemente no me esta funcionando.
Aclaro que LOGPOS no tiene un campo CALLREFID1 solo CALLREFID
Lo puse asi, no se si esta correcto:

Código SQL [-]
SELECT A.CALLREFID, A.CALLREFID1, A.LOGDATE, A.LOGTIME, A.PHONE, A.LENGTHCALL,
B.POSNUMBER, B.AGENTID, B.SKILL 
FROM LOGCALL A 
LEFT OUTER JOIN LOGPOS B ON (A.CALLREFID = B.CALLREFID) 
LEFT JOIN LOGPOS C ON (A.CALLREFID1 = C.CALLREFID) 
WHERE A.LOGDATE BETWEEN '20120701' AND '20120707' 
AND ((A.CALLTYPE = 'I') OR ((A.CALLTYPE = 'O') 
AND (A.RESULT IN ('10','18','1004')) AND (A.PHONE <> '')))

No me da error pero me trae montones de registros repetidos.


La franja horaria es GMT +2. Ahora son las 11:09:45.

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