Ver Mensaje Individual
  #7 (permalink)  
Antiguo 15/01/2009, 17:25
chelodelsur
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Select anidados???

HAber si logro explicar mejor lo que pasa.

este query levanta los datos agrupados por año para cada agente. OK (ignoren el Case y la columna mes )

Código:
Select
distinct a.agente_evaluado AGENTE,
Year(Fecha_evaluacion) as 'Año',
CASE 
WHEN MONTH(fecha_evaluacion) = 1 THEN "enero"
WHEN MONTH(fecha_evaluacion) = 2 THEN "febrero"
WHEN MONTH(fecha_evaluacion) = 3 THEN "marzo"
WHEN MONTH(fecha_evaluacion) = 4 THEN "abril"
WHEN MONTH(fecha_evaluacion) = 5 THEN "mayo"
WHEN MONTH(fecha_evaluacion) = 6 THEN "junio"
WHEN MONTH(fecha_evaluacion) = 7 THEN "julio"
WHEN MONTH(fecha_evaluacion) = 8 THEN "agosto"
WHEN MONTH(fecha_evaluacion) = 9 THEN "septiembre"
WHEN MONTH(fecha_evaluacion) = 10 THEN "octubre"
WHEN MONTH(fecha_evaluacion) = 11 THEN "noviembre"
WHEN MONTH(fecha_evaluacion) = 12 THEN "diciembre"
ELSE "NUUL_MES" END  AS MES ,
SUM(IF(ID_LLAMADA>0,1,0))as 'TOTAL EVALUACIONES',
(select 
    count(b.errores_fatales)
    from evaluaciones d
    inner join notas_evaluaciones b
    on d.id_evaluacion = b.id_evaluacion
    where (d.identifica_cliente='1'OR d.escucha_activa='1' OR d.asesorar='1'
    OR d.conocimiento_producto='1' OR d.procedimientos='1' OR d.ingreso_datos='1')
    and d.agente_evaluado=a.agente_evaluado     ) as 'TOT EVAL CON ERRORES FATALES',
SUM(b.errores_fatales) as 'TOT ERRORES FATALES',
format(avg(b.NOTA_AREA_1),1) as  `ESTILO MANEJO LLAMADA`,
format(avg(b.NOTA_AREA_2),1) as  `ESTRUCTURA / HABILIDADES`,
format(avg(b.NOTA_AREA_3),1) as  `EFICIENCIA / CONOCIMIENTO`,
format(avg(b.NOTA_EVALUACION),1) as  `NOTA FINAL`
FROM evaluaciones a
INNER JOIN notas_evaluaciones b
ON a.id_evaluacion = b.id_evaluacion
left join agentes c
oN a.agente_evaluado = c.nombre_agente
where a.fecha_evaluacion between '2008/01/01' and  '2008/12/31'
And a.agente_evaluado like'%' 
and c.estado='activo'
and (c.tipo_turno='full time' or c.tipo_turno='part time')
GROUP BY a.agente_evaluado, año ORDER BY a.agente_evaluado asc, fecha_evaluacion asc;
Ahora si a este mismo codigo le cambio el group by de año a id_evaluación, para que me muestre todas la evaluaciones por agente. tengo que agregarle al where del select anidado la condición de igualdad entre las dos consultas, caso contrario me devolvía el total del año para cada registro de es agente. Bien esto tambien ya está ok

Código:
Select
distinct a.agente_evaluado AGENTE,
Year(Fecha_evaluacion) as 'Año',
CASE 
WHEN MONTH(fecha_evaluacion) = 1 THEN "enero"
WHEN MONTH(fecha_evaluacion) = 2 THEN "febrero"
WHEN MONTH(fecha_evaluacion) = 3 THEN "marzo"
WHEN MONTH(fecha_evaluacion) = 4 THEN "abril"
WHEN MONTH(fecha_evaluacion) = 5 THEN "mayo"
WHEN MONTH(fecha_evaluacion) = 6 THEN "junio"
WHEN MONTH(fecha_evaluacion) = 7 THEN "julio"
WHEN MONTH(fecha_evaluacion) = 8 THEN "agosto"
WHEN MONTH(fecha_evaluacion) = 9 THEN "septiembre"
WHEN MONTH(fecha_evaluacion) = 10 THEN "octubre"
WHEN MONTH(fecha_evaluacion) = 11 THEN "noviembre"
WHEN MONTH(fecha_evaluacion) = 12 THEN "diciembre"
ELSE "NUUL_MES" END  AS MES ,
SUM(IF(ID_LLAMADA>0,1,0))as 'TOTAL EVALUACIONES',
(select 
    count(b.errores_fatales)
    from evaluaciones d
    inner join notas_evaluaciones b
    on d.id_evaluacion = b.id_evaluacion
    where (d.identifica_cliente='1'OR d.escucha_activa='1' OR d.asesorar='1'
    OR d.conocimiento_producto='1' OR d.procedimientos='1' OR d.ingreso_datos='1')
    and d.agente_evaluado=a.agente_evaluado 
    and d.id_evaluacion = a.id_evaluacion) as 'TOT EVAL CON ERRORES FATALES',
SUM(b.errores_fatales) as 'TOT ERRORES FATALES',
format(avg(b.NOTA_AREA_1),1) as  `ESTILO MANEJO LLAMADA`,
format(avg(b.NOTA_AREA_2),1) as  `ESTRUCTURA / HABILIDADES`,
format(avg(b.NOTA_AREA_3),1) as  `EFICIENCIA / CONOCIMIENTO`,
format(avg(b.NOTA_EVALUACION),1) as  `NOTA FINAL`
FROM evaluaciones a
INNER JOIN notas_evaluaciones b
ON a.id_evaluacion = b.id_evaluacion
left join agentes c
oN a.agente_evaluado = c.nombre_agente
where a.fecha_evaluacion between '2008/01/01' and  '2008/12/31'
And a.agente_evaluado like'%' 
and c.estado='activo'
and (c.tipo_turno='full time' or c.tipo_turno='part time')
GROUP BY a.agente_evaluado, a.id_evaluacionORDER BY a.agente_evaluado asc, fecha_evaluacion asc;
Bien ahora necesito los mismos datos pero agrupados por mes, entonces cambié el gropu by a mes , y hasta ahí no mas llego. he cambiado los filtros del where en el select anidado, probado de varias manera el group by y nada.

Código:
Select
distinct a.agente_evaluado AGENTE,
Year(Fecha_evaluacion) as 'Año',
CASE 
WHEN MONTH(fecha_evaluacion) = 1 THEN "enero"
WHEN MONTH(fecha_evaluacion) = 2 THEN "febrero"
WHEN MONTH(fecha_evaluacion) = 3 THEN "marzo"
WHEN MONTH(fecha_evaluacion) = 4 THEN "abril"
WHEN MONTH(fecha_evaluacion) = 5 THEN "mayo"
WHEN MONTH(fecha_evaluacion) = 6 THEN "junio"
WHEN MONTH(fecha_evaluacion) = 7 THEN "julio"
WHEN MONTH(fecha_evaluacion) = 8 THEN "agosto"
WHEN MONTH(fecha_evaluacion) = 9 THEN "septiembre"
WHEN MONTH(fecha_evaluacion) = 10 THEN "octubre"
WHEN MONTH(fecha_evaluacion) = 11 THEN "noviembre"
WHEN MONTH(fecha_evaluacion) = 12 THEN "diciembre"
ELSE "NUUL_MES" END  AS MES ,
SUM(IF(ID_LLAMADA>0,1,0))as 'TOTAL EVALUACIONES',
(select 
    count(b.errores_fatales)
    from evaluaciones d
    inner join notas_evaluaciones b
    on d.id_evaluacion = b.id_evaluacion
    where (d.identifica_cliente='1'OR d.escucha_activa='1' OR d.asesorar='1'
    OR d.conocimiento_producto='1' OR d.procedimientos='1' OR d.ingreso_datos='1')
    and d.agente_evaluado = a.agente_evaluado
    and d.id_evaluacion = a.id_evaluacion) as 'TOT EVAL CON ERRORES FATALES',
SUM(b.errores_fatales) as 'TOT ERRORES FATALES',
format(avg(b.NOTA_AREA_1),1) as  `ESTILO MANEJO LLAMADA`,
format(avg(b.NOTA_AREA_2),1) as  `ESTRUCTURA / HABILIDADES`,
format(avg(b.NOTA_AREA_3),1) as  `EFICIENCIA / CONOCIMIENTO`,
format(avg(b.NOTA_EVALUACION),1) as  `NOTA FINAL`
FROM evaluaciones a
INNER JOIN notas_evaluaciones b
ON a.id_evaluacion = b.id_evaluacion
left join agentes c
oN a.agente_evaluado = c.nombre_agente
where a.fecha_evaluacion between '2008/01/01' and  '2008/12/31'
And a.agente_evaluado like'%' 
and c.estado='activo'
and (c.tipo_turno='full time' or c.tipo_turno='part time')
GROUP BY a.agente_evaluado, mes ORDER BY a.agente_evaluado asc, fecha_evaluacion asc;
Por ejemplo si en el group by tengo mes, y en el where del select anidado no tengo puesta la condición "and d.id_evaluacion = a.id_evaluacion" la consulta me devuelve en la columna 'TOT EVAL CON ERRORES FATALES', el total de errores de ese usuario en el año. Ahora si agrego al where del select anidado "and d.id_evaluacion = a.id_evaluacion" la consulta me devuelve el valor del primer mes con registros para un usuario en particular.

Se agradece su paciencia y ayuda

Chelo