Ver Mensaje Individual
  #15 (permalink)  
Antiguo 18/06/2010, 18:19
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: 17 años
Puntos: 2658
Respuesta: WITH ROLLUP no me suma una columna

Bien, habiendo tenido ya oportunidad de analizar el contenido de la tabla y viendo la estructura de datos, el error parece provenir de un defecto de diseño, sumado a un un desaprovechamiento de las propiedades de los campos.
El tema es así: Hay cierta inconsistencia en la estructura de datos porque tienes dos columnas de fecha distintas y no hay forma que cumplan con una consulta óptima en esas condiciones. Además una de ellas hace que el otro campo se vuelva innecesario si sólo variará su valor de 1 a 0.
Tu estructura es esta:

Código MySQL:
Ver original
  1. CREATE TABLE  `recomendacion` (
  2.   `idRecomendacion` int(11) NOT NULL auto_increment,
  3.   `idUsuario` varchar(255) default NULL,
  4.   `amigo` varchar(255) default NULL,
  5.   `lead` tinyint(1) NOT NULL default '0',
  6.   `click` tinyint(1) NOT NULL default '0',
  7.   `fecha` varchar(14) NOT NULL,
  8.   `fechaClick` varchar(14) NOT NULL,
  9.   `fechaLead` varchar(14) default NULL,
  10.   `puntos` int(11) NOT NULL default '50',
  11.   PRIMARY KEY  (`idRecomendacion`)
  12. COMMENT='Representa las recomendaciones hechas por los usuarios';
Todos los campos están declarados como NOT NULL, pero el caso es que de esos al menos fechaClick y fechaLead no deberían serlo porque sólo cuando se producen los eventos que los alimentan.
Al cargarlos con un vacío no permites que exista un valor NULL, con lo que si quisieras contar los campos, los va a contar como si fuesen fechas. Por eso es que no sirve ese esquema.
Esto es lo que hay:
Código MySQL:
Ver original
  1. mysql> SELECT idUsuario, lead, fecha, fechaLead, puntos, idRecomendacion
  2.     -> FROM recomendacion r;
  3. +--------------------------+------+----------------+----------------+--------+-----------------+
  4. | idUsuario                | lead | fecha          | fechaLead      | puntos | idRecomendacion |
  5. +--------------------------+------+----------------+----------------+--------+-----------------+
  6. | [email protected]      |    0 | 20100101000000 |                |     50 |               1 |
  7. | [email protected]      |    0 | 20100103000000 |                |      0 |               4 |
  8. | [email protected]      |    1 | 20100105000000 | 20100107000000 |    500 |               6 |
  9. | [email protected]      |    0 | 20100107000000 |                |      0 |              21 |
  10. | [email protected] |    0 | 20100105000000 |                |      0 |              26 |
  11. | [email protected]   |    0 | 20100109000000 |                |      0 |              27 |
  12. | [email protected]   |    0 | 20100111000000 |                |      0 |              28 |
  13. | [email protected]  |    0 | 20100212000000 |                |      0 |              30 |
  14. +--------------------------+------+----------------+----------------+--------+-----------------+
  15. 8 rows in set (0.00 sec)

La tabla, para tener una estructura coherente debería ser:
Código MySQL:
Ver original
  1. CREATE TABLE  `recomendacion` (
  2.   `idRecomendacion` int(11) UNSIGNED NOT NULL auto_increment,
  3.   `idUsuario` varchar(255) default NULL,
  4.   `amigo` varchar(255) default NULL,
  5.   `lead` tinyint(1) NOT NULL default '0',
  6.   `click` tinyint(1) NOT NULL default '0',
  7.   `fecha` DATE NOT NULL,
  8.   `fechaClick` DATE NULL,
  9.   `fechaLead` DATE NULL,
  10.   `puntos` int(11) UNSIGNED NOT NULL default '50',
  11.   PRIMARY KEY  (`idRecomendacion`)
  12. COMMENT='Representa las recomendaciones hechas por los usuarios';
Los datos deberían ir así:
Código MySQL:
Ver original
  1. INSERT INTO `RECOMENDACION`
  2. (`idRecomendacion`, `idUsuario`, `amigo`, `lead`, `click`, `fecha`, `fechaClick`, `fechaLead`, `puntos`)
  3. (1,   '[email protected]',       'asdfasdf4343434343434', 0, 0,  '2010-01-01', NULL, NULL, 50),
  4. (4,   '[email protected]',       'adsfatraertatrggdf', 0, 0,     '2010-01-03', NULL, NULL, 0),
  5. (6,   '[email protected]',       'erferer4rer4r45455', 1, 0,     '2010-01-05', NULL, '2010-01-07', 500),
  6. (21,   '[email protected]',      'sdlkfjmwoeiruq09ewrn', 0, 0,   '2010-01-07', NULL, NULL, 0),
  7. (26,   '[email protected]', 'asdmfvnweoriuqewr9iu', 0, 0,   '2010-01-05', NULL, NULL, 0),
  8. (27,   '[email protected]',   'adsfcweripeo489r8', 0, 0,      '2010-01-09', NULL, NULL, 0),
  9. (28,   '[email protected]',   'sdjfmoeitu495845r45r454', 0, 0,'2010-01-11', NULL, NULL, 0),
  10. (30,   '[email protected]',  'asdfkjaeworiewadsf', 0, 0,     '2010-02-12', NULL, NULL, 0);
Y la consulta sería:
Código MySQL:
Ver original
  1. SELECT IFNULL(FECHA_LEAD,  'Totales') FECHA, RECOMENDACIONES, LEADS
  2.   (SELECT
  3.     IF(fechaLead IS NOT NULL, fechaLead, fecha) FECHA_LEAD,
  4.     COUNT(idRecomendacion) recomendaciones,
  5.     COUNT(fechaLead) leads
  6.   FROM recomendacion r
  7.   GROUP BY FECHA_lead WITH ROLLUP) T1
  8. ORDER BY FECHA;
  9.  
  10. +------------+-----------------+-------+
  11. | FECHA      | RECOMENDACIONES | LEADS |
  12. +------------+-----------------+-------+
  13. | 2010-01-01 |               1 |     0 |
  14. | 2010-01-03 |               1 |     0 |
  15. | 2010-01-05 |               1 |     0 |
  16. | 2010-01-07 |               2 |     1 |
  17. | 2010-01-09 |               1 |     0 |
  18. | 2010-01-11 |               1 |     0 |
  19. | 2010-02-12 |               1 |     0 |
  20. | Totales    |               8 |     1 |
  21. +------------+-----------------+-------+
  22. 8 rows in set (0.00 sec)

Nota: es muchísmo más eficiente guardar una fecha como DATE o DATETIME que como VARCHAR. ¿Por qué las pusiste en ese tipo de campo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)