Ver Mensaje Individual
  #6 (permalink)  
Antiguo 12/12/2011, 06:52
massu_vago
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 15 años, 10 meses
Puntos: 0
Pregunta Respuesta: Referencias Cruzadas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El COUNT() no es funcional para lo que quieres hacer, porque en el contexto que lo usas siempre sumará datos de la misma forma, ya que en realidad para que los cuente, el CASE interior debe devolver algo. Y por "algo" me refiero a cualquier cosa que no sea un NULL... incluyendo los ceros.
O sea que te está contando hasta los ceros.

Para que veas que es cierto:
Código MySQL:
Ver original
  1. mysql> SELECT COUNT(0) cuenta;
  2. +--------+
  3. | cuenta |
  4. +--------+
  5. |      1 |
  6. +--------+
  7. 1 row in set (0.00 sec)

Por otro lado, hacer subconsultas en las columnas del SELECT es algo extremadamente ineficiente , ya que esas subconsultas se ejecutan una vez por cada registro devuelto por la consulta mayor. O sea que si esa consulta devolviese 1000 registros, cada subconsulta del SELECT se ejecutará 1000 veces...

¿Un espanto, no?

Tratemos de pulir un poco la cosa:
Código MySQL:
Ver original
  1.     CT.DESC_PRODUCTO PROD,
  2.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY), 1, 0)) DIA_1,
  3.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF) AND FECHA = '2011-11-16', INTERVAL 5 DAY), 1, 0)) DIA_2,
  4.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 4 DAY), 1, 0)) DIA_3,
  5.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 3 DAY), 1, 0)) DIA_4,
  6.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 2 DAY), 1, 0)) DIA_5,
  7.     SUM(IF(FECHA = DATE_SUB(MAX(T1.DIA_REF), INTERVAL 1 DAY), 1, 0)) DIA_6,
  8.     SUM(IF(FECHA = T1.DIA_REF, 1, 0)) DIA_7
  9. FROM ces_ivr_eventos CE INNER JOIN ces_ivr_tipo_vel_inet CT ON CE.RUT = CT.RUT_PERSONA
  10.     JOIN (SELECT MAX(FECHA) DIA_REF FROM ces_ivr_eventos) T1
  11.     abrev_evento = 'internet' AND
  12.     FECHA BETWEEN DATE_SUB(MAX(T1.DIA_REF), INTERVAL 6 DAY) AND DIA_REF
  13. GROUP BY CT.DESC_PRODUCTO
  14. ORDER BY PROD;

No estoy muy seguro de que si es esto lo que quieres lograr, pero usando SUM() e IF() seguro que lograrás contar mejor que con ese enredo que estás haciendo ahora.

Lo que si, para poder ayudarte mejor sería bueno que nos explicases qué es lo que se supone que estás contando y qué es lo que deseas lograr. Porque la consulta que planteas es, como mínimo, confusa.
gracias por la respuesta, mira para explicar de mejor manera lo que quiero hacer es lo siguiente, en una empresa de telecomunicaciones llaman todos los días cierta cantidad de clientes, consultando por cierto producto, en este caso velocidades de internet lo que necesito es mostrar cuantas veces llamaron por cada velocidad en determinado dia ej: día 1 : 300k llamaron 31 veces.

lo que hice en mi código es hacer una referencia cruzada ocea que a la izquierda me muestre los nombres de las velocidades de internet y arriba una semana por eso puse el interval -6, -5, -4 ... al medio se encuentran las referencias cruzada ocea que por el tipo de velocidad cuantos clientes llamaron el dia 1, dia 2 ,etc...

el problema es que ya hice la estructura de la tabla con los case pero cuando cuento los llamados los del dia 1 perfecto sin problemas pero en los demas dias me muestra los mismos valores pese a que en el interval cambio los dias a consultar.

espero haberme explicado bien en esta ocacion quedo atento a sus respuestas, y gracias de antemano gracias te diste el tiempo de explicarme de mejor manera.