Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Otra de Join

Estas en el tema de Otra de Join en el foro de Mysql en Foros del Web. Hola Tengo nuevamente porblemas con un join Código: SELECT log.FECHA_DATE AS FECHA, count(IF(log.fecha_date,0,0)) AS `LLAMADAS ENVIADAS A IVR`, SUM(IF(log.trf_agente='',log.t_mensaje='CODIGO' OR log.t_mensaje='GENERAL' OR log.t_mensaje='GENERAL PRE' OR ...
  #1 (permalink)  
Antiguo 30/09/2008, 14:55
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Otra de Join

Hola
Tengo nuevamente porblemas con un join

Código:
SELECT 
log.FECHA_DATE AS FECHA,
count(IF(log.fecha_date,0,0)) AS `LLAMADAS ENVIADAS A IVR`,
SUM(IF(log.trf_agente='',log.t_mensaje='CODIGO' OR log.t_mensaje='GENERAL' OR log.t_mensaje='GENERAL PRE' OR log.t_mensaje='HOTLINE'OR log.t_mensaje='HOTLINE-ANEXO',0))AS `ATE MENSAJE ESPECIAL_IVR`,
SUM(IF(TIPO_LLAMADA='CAI',RECIBIDO,0)) CAI,
SUM(IF(TIPO_LLAMADA='IVR COMERCIAL',RECIBIDO,0)) IVR_COM,
SUM(IF(TIPO_LLAMADA='IVR SUMINISTRO',RECIBIDO,0)) IVR_SUMI,
SUM(IF(TIPO_LLAMADA='IVR OTROS',RECIBIDO,0)) IVR_OTROS,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS'  OR TIPO_LLAMADA='CALEFACCION',RECIBIDO,0)) TOTAL_RECIBIDO,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS'  OR TIPO_LLAMADA='CALEFACCION',CONTESTADO,0)) TOTAL_CONTESTADO,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS'  OR TIPO_LLAMADA='CALEFACCION',ABANDONADO,0)) TOTAL_ABANDONADO
FROM llamadas.log  LEFT JOIN rrserver.reg_diario
ON log.FECHA_DATE = reg_diario.FECHA_DATE
WHERE log.FECHA_Date 
BETWEEN '2008-09-22'
AND '2008-09-28'
GROUP BY reg_diario.FECHA_DATE
Este codigo hace una consulta a dos tablas que estan en bases distintas, dentro del mismo host. el dato en comun es el campo fecha_date, en ambas tablas.
La consulta en si, se ejecuta, pero los resultados no son los correctos.
Por ejemplo la consulta debe traer la cantidad de registros para una fecha agrupando en varias categorías: " llamadas enviadas a IVR", "atendidas por mensaje especial ivr", etc.(estos datos estan en la tabla log, de la base Datos llamadas) Bien el problema que se me presenta es que en la tabla reg_diario, del la base rrserver, hay varios tipos de llamadas para una misma fecha, por ejemplo: para la fecha 2008-09-28, hay registros de llamadas en CAI, IVR_COM, e IVR_SUMI. Entonces al hacer la consulta si por ejemplo en el campo "ATE MENSAJE ESPECIAL_IVR" hay 10 registros para la fecha 2008-09-28 entoces la consulta me dice que hay 30, asumo que es porque en la tabla reg_diario para esa fecha hay datos en 3 tipos de llamadas (CAI, IVR_COM, e IVR_SUMI), por que al probar con otra fecha en donde solo hay regsitros para una determinada fecha en dos tipos de llamadas este resultado lo multiplica por 2.
Uffff salio medio largo el cuento, espero haberme explicado bien.

Como siempre desde ya gracias por su siempre oportuna ayuda.

Marcelo
  #2 (permalink)  
Antiguo 01/10/2008, 10:00
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Otra de Join

Alguien puede darme una mano??
  #3 (permalink)  
Antiguo 02/10/2008, 12:47
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Otra de Join

Tal vez me expliqué mal o esta mal enfocada mi idea

Haber si logro hacerlo ahora. Tengo dos tablas en las que hay datos que deseo mostrar en una unica consulta o pantalla, lo unico que tienen en comun estas dos tablas es el campo fecha, por lo pensé que una manera de hacerlo sería con un join.
En resumen necesito listar en una misma consulta los datos de una tabla A , con los de una tabla B teniendo como dato comun la fecha en ambas tablas.

Algo así:

fecha (A=B), campoA 1, CampoA 2, CampoB 1, CampoB 2, etc

Se agradece sus comentarios y/o mejores ideas.

Gracias
  #4 (permalink)  
Antiguo 02/10/2008, 15:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Otra de Join

SELECT tabla1.fecha, tabla1.campo1, tabla1.campo2, tabla2.campo1, tabla2.campo2 FROM tabla1 INNER JOIN tabla2 ON tabla1.fecha = tabla2.fecha

Pero, ojo, si empleas campos datetime o timestamp y quieres que se crucen por el día, tendrás que usar

SELECT date(tabla1.fecha) AS FECHA, tabla1.campo1, tabla1.campo2, tabla2.campo1, tabla2.campo2 FROM tabla1 INNER JOIN tabla2 ON date(tabla1.fecha) = DATE(tabla2.fecha)
  #5 (permalink)  
Antiguo 02/10/2008, 17:07
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Otra de Join

Muchas gracias Juerena por la respuesta pero..

Mi problema es que en las tablas no hay la misma cantidad de registro por fecha, así por ejemplo si los datos son como siguen




La consulta me repite los datos de la fecha 01-09-2008, cccc, ddddd. de la tabla 2 tantas veces como registros existan para esa fecha en la tabla 1.

Por eso en cuando trabajo estos datos para agruparlos o sumarlos (como puse en el primer cometario de este post) la consulta me multiplica el valor tantas veces como registros existan para esa fecha o condición an la tabla 1.

Espero me puedas dar una mano, tal vez el camino pueda ser otro. por ejemplo hacer las consultas por separado y cargarlos en una tabla unica para luego hacer la consulta del usuario final.

Agradeceré su ayuda

Marcelo
  #6 (permalink)  
Antiguo 04/10/2008, 08:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Otra de Join

Marcelo,

tengo algunas dudas. Uno de los principales problemas es que no sé si sólo buscas los datos de las tablas cuyas fechas son coincidentes en las dos tablas. Porque, si también buscas contar aquellos datos de una fecha que sólo aparece en una tabla y ninguna de las tablas tiene todas las fechas, tendrás un problema, tal y como yo lo veo, porque, según creo, no podemos unir los datos de una tabla o tablas con el resultado de la unión de dos tablas (no estoy seguro).
Por otra parte, reunir y contar los datos que dices, puedes hacerlo mediante un count() y group_concat. Pero no me atrevo a enviarte la sintaxis porque pienso que luego quieres hacer agrupaciones por tipo de llamada, etc. Deberías decirnos exactamente lo que que quieres sacar al final y lo que tienes ahora, con datos concretos, es decir, con algún ejemplo. Creo que así te podríamos ayudar mejor.
  #7 (permalink)  
Antiguo 06/10/2008, 20:01
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Otra de Join

Nuevamente gracias Jurena por el tiempo que dedicas a ayudar.

Mira actualmente tengo estas 2 consultas que ejecuto separadamente y con las que contruyo un solo informe, de momento exporto los datos (excel) y luego los junto para hacer una sola hoja con el Informe.

La idea es poder ejecutar una sola consulta y dejarla lista para la vista del usuario final.
Como explicaba antes lo unico que liga los datos de estas tablas son el campo fecha, siempre existirán en ambas tablas todas la fechas. y sí tienes razon en las consultas por separado como verás en los códigos hay varias agrupaciones o sumas de datos.
Las consultas por separado funcionan bien, pero al juntarlas me multiplica los datos en funcion de la catidad de registros para una misma fecha en la otra tabla por ejemplo en la tabla log hay solo un registro por cada fecha, sin embargo en la tabla reg_diario, hay entre 3 a 5 registros para cada fecha, lo que hace que al hacer el cruce, los datos de la tabla log sena mutiplicados por 3 o 5 dependiendo de los registros para esa fecha que existan en la tabla reg_diario.

Ufff no solo suena enredado, es realmente enredado



CODIGO 1
Código:
SELECT 
reg_diario.fecha_date,
SUM(IF(TIPO_LLAMADA='CAI',RECIBIDO,0)) CAI,
SUM(IF(TIPO_LLAMADA='IVR COMERCIAL',RECIBIDO,0)) IVR_COM,
SUM(IF(TIPO_LLAMADA='IVR SUMINISTRO',RECIBIDO,0)) IVR_SUMI,
SUM(IF(TIPO_LLAMADA='IVR OTROS',RECIBIDO,0)) IVR_OTROS,
SUM(IF(TIPO_LLAMADA='OFICINA',RECIBIDO,0)) OFICINA,
SUM(IF(TIPO_LLAMADA='CALEFACCION',RECIBIDO,0)) CALEFC,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',RECIBIDO,0)) TOTAL_RECIBIDO_ACD,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',CONTESTADO,0)) TOTAL_CONTESTADO_AGENTES,
SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',ABANDONADO,0)) TOTAL_ABANDONADO,
FORMAT((SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',ABANDONADO,0))/SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',RECIBIDO,0)))*100,0)TASA_ABANDONO,
FORMAT(((SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',NIVEL_SERV_NUMERADOR,0)))/ (SUM(IF(TIPO_LLAMADA='CAI' OR TIPO_LLAMADA='IVR COMERCIAL' OR TIPO_LLAMADA='IVR SUMINISTRO' OR TIPO_LLAMADA='IVR OTROS' OR TIPO_LLAMADA='OFICINA' OR TIPO_LLAMADA='CALEFACCION',NIVEL_SERV_DENOMINADOR,0))))*100,0) NIVEL_SERVICIO
FROM rrserver.reg_diario 
WHERE reg_diario.fecha_date 
BETWEEN '2008-09-29'
AND '2008-10-31'
GROUP BY reg_diario.fecha_date
CODIGO 2
Código:
SELECT Year(log_0.fecha_date) as `AÑO`,  
CASE 
 WHEN MONTH(log_0.fecha_date) = 1 THEN "enero"  
 WHEN MONTH(log_0.fecha_date) = 2 THEN "febrero" 
 WHEN MONTH(log_0.fecha_date) = 3 THEN "marzo" 
 WHEN MONTH(log_0.fecha_date) = 4 THEN "abril" 
 WHEN MONTH(log_0.fecha_date) = 5 THEN "mayo" 
 WHEN MONTH(log_0.fecha_date) = 6 THEN "junio" 
 WHEN MONTH(log_0.fecha_date) = 7 THEN "julio" 
 WHEN MONTH(log_0.fecha_date) = 8 THEN "agosto" 
 WHEN MONTH(log_0.fecha_date) = 9 THEN "septiembre" 
 WHEN MONTH(log_0.fecha_date) = 10 THEN "octubre" 
 WHEN MONTH(log_0.fecha_date) = 11 THEN "noviembre" 
 WHEN MONTH(log_0.fecha_date) = 12 THEN "diciembre"  
ELSE 'NUUL_MES' END  AS MES ,
log_0.fecha_date as `FECHA`,  
CASE  
WHEN weekday(log_0.fecha_date) = 0 THEN "Lunes"  
WHEN weekday(log_0.fecha_date) = 1 THEN "Martes" 
WHEN weekday(log_0.fecha_date) = 2 THEN "Miercoles"  
WHEN weekday(log_0.fecha_date) = 3 THEN "Jueves"  
WHEN weekday(log_0.fecha_date) = 4 THEN "Viernes" 
WHEN weekday(log_0.fecha_date) = 5 THEN "Sabado"  
WHEN weekday(log_0.fecha_date) = 6 THEN "Domingo" 
 ELSE 'NUUL_DIA' END AS DIA,   
 SUM(IF(empresa_sele='OFICINA2' OR empresa_sele='OFICINA1' OR empresa_sele='OFICINA3' OR empresa_sele='OFICINA4',1,0)) AS CONSULTAS_BD,    
 SUM(IF(TRF_AGENTE='8296' OR TRF_AGENTE='8297' OR TRF_AGENTE='8298' OR TRF_AGENTE='8299',1,0)) AS TRANSFERIDO_ACD,   SUM(IF(t_mensaje='',1,0)) AS NO_ESC_MSJE,  
  sum(IF(trf_agente='',t_mensaje='CODIGO' OR t_mensaje='GENERAL' OR t_mensaje='GENERAL PRE' OR t_mensaje='HOTLINE'OR t_mensaje='HOTLINE-ANEXO',0))as ATE_MENSAJE_ESPECIAL_IVR,   
 SUM(IF(t_mensaje='CODIGO' OR t_mensaje='GENERAL' OR t_mensaje='GENERAL PRE' OR t_mensaje='HOTLINE'OR t_mensaje=         'HOTLINE-ANEXO',1,0)) AS TOTAL_MSJE_ESPECIAL_IVR,  
  SUM(IF(ROW_ID,1,0)) AS TOTAL_TRAFICO  
FROM ivr.log  
WHERE log_0.fecha_date>='2008-10-01'  
AND log_0.fecha_date<='2008-10-31'  
GROUP BY YEAR(log_0.fecha_date),MONTH(log_0.fecha_date),(log_0.fecha_date) 
ORDER BY (log_0.fecha_date)
Bueno espero su ayuda

Gracias una vez más
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:15.