Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/05/2010, 21:00
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ayudenme a solucionar este problema

Bueno, si eso es lo que estás tratando de hacer, entonces el problema es muy obvio: Tu consulta contiene demasiadas subconsultas, cada una con una subconsulta anidada.
Es innecesario y terriblemente ineficiente. Estás recargando al parser a morir...

La única solución que tienes es replantearte toda la consulta, porque obviamente se puede hacer de otro modo.

Te doy una ayuda: Estas contando cantidades de instancias en las que se cumple un conjunto de condiciones, por lo que en realidad es posible que cada ocasión esté barriendo toda la tabla.
¿Por qué no hacer, entonces, que la recorra una sola vez?:

Código MySQL:
Ver original
  1.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 24 AND edad_paciente < 30 , 1, 0)) papsAntUno,
  2.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 29 AND edad_paciente < 35 , 1, 0)) papsAntDos,
  3.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 34 AND edad_paciente < 40 , 1, 0)) papsAntTres,
  4.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 39 AND edad_paciente < 45 , 1, 0)) papsAntCuatro,
  5.   SUM(IF(id_tipo_examen = 1 AND edad_paciente > 45 AND edad_paciente < 50, 1, 0)) papsAntCinco,
  6.   /* Aquí irían los siguientes casos hasta completar los resultados */
  7.  
  8. FROM vw_rpt_ivaa
  9.   id_municipio = pIdUnidad AND
  10.   fecha_examen BETWEEN pDateUno AND pDateDos;

Tips:

- AS es una cláusula obsoleta que sólo se conserva por compatibilidad. Es innecesaria.

- No abuses de las subconsultas. No tiene sentido usarlas para crear un sólo valor, el cual puede ser obtenido de una función almacenada (sería más práctico). Una subconsulta tiene más sentido si la vas a usar para obtener un conjunto de registros.

- Los rangos de edades como los has puesto son funcionales, pero es más óptimo usar BETWEEN para eso:

Código MySQL:
Ver original
  1. SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 25 AND 29 , 1, 0)) papsAntUno,
  2.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 30 AND 34 , 1, 0)) papsAntDos,
  3.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 35 AND 39 , 1, 0)) papsAntTres,
  4.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 40 AND 44 , 1, 0)) papsAntCuatro,
  5.   SUM(IF(id_tipo_examen = 1 AND edad_paciente BETWEEN 45 AND 49, 1, 0)) papsAntCinco,

Puede parecer lo mismo, pero para MySQL es más eficiente de ese modo, porque internamente la implementación del BETWEEN usa diferentes métodos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)