Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/12/2011, 21:56
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: Referencias Cruzadas

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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)