Ver Mensaje Individual
  #5 (permalink)  
Antiguo 02/03/2012, 11:40
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: mysql hacer dos consultas a la vez misma tabla

Hola de nuevo:

Aunque trataste de explicar por qué el + 0 no me quedó claro qué es lo que estás intentando hacer (y digo intentando porque mencionas que el código no te funciona).
En primer Lugar deberías decirnos de qué tipo es tu columna fecha, esperaría que fuera de tipo date o datetime, pero lamentablemente aun muchas personas ponen las fechas en campos tipo varchar o cualquier otro y sólo se complican (y nos complican). No estoy seguro si revisaste la opción que te pongo con el WITH ROLLUP... realmente deberías considerarlo. Si entendí bien qué es lo que quieres hacer creo que esto te podría servir:

Supongamos que tienes más o menos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------------+----------+
  3. | fecha      | cantidad |
  4. +------------+----------+
  5. | 2012-02-01 |       10 |
  6. | 2012-02-02 |       20 |
  7. | 2012-03-05 |       32 |
  8. | 2012-03-07 |       12 |
  9. | 2011-02-12 |       17 |
  10. | 2011-02-28 |       21 |
  11. +------------+----------+
  12. 6 rows in set (0.00 sec)

Si entendí correctamente lo que quieres hacer es calcular los subtotales por mes y presentarlos en la misma consulta, junto con sus datos en bruto. utilizando UNION podrías hacer algo como esto;

Código MySQL:
Ver original
  1. mysql> SELECT 1 `nivel`, YEAR(fecha) `año`, MONTH(fecha) `mes`,
  2.     -> NULL `dia`, SUM(cantidad) total
  3.     -> FROM tabla
  4.     -> GROUP BY YEAR(fecha), MONTH(fecha)
  5.     -> UNION
  6.     -> SELECT 2 nivel, YEAR(fecha) `año`, MONTH(fecha) `mes`,
  7.     -> DAY(fecha) `dia`, cantidad total
  8.     -> FROM tabla
  9.     -> ORDER BY `año`, `mes`, `nivel`, `dia`;
  10. +-------+------+------+------+-------+
  11. | nivel | año  | mes  | dia  | total |
  12. +-------+------+------+------+-------+
  13. |     1 | 2011 |    2 | NULL |    38 |
  14. |     2 | 2011 |    2 |   12 |    17 |
  15. |     2 | 2011 |    2 |   28 |    21 |
  16. |     1 | 2012 |    2 | NULL |    30 |
  17. |     2 | 2012 |    2 |    1 |    10 |
  18. |     2 | 2012 |    2 |    2 |    20 |
  19. |     1 | 2012 |    3 | NULL |    44 |
  20. |     2 | 2012 |    3 |    5 |    32 |
  21. |     2 | 2012 |    3 |    7 |    12 |
  22. +-------+------+------+------+-------+
  23. 9 rows in set (0.00 sec)

Observa que se agrega una columna nivel para determinar si se trata de un subtotal o de un dato en bruto, el cual nos sirve justamente para ordenar primero los subtotales y depues los datos.

Ahora bien, esto mismo (y más completo aun) lo puedes hacer con el ROLLUP que te mencioné desde el post pasado:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> CASE WHEN (`mes` IS NULL) THEN 1 ELSE
  3.     -> CASE WHEN (`dia` IS NULL) THEN 2 ELSE 3 END
  4.     -> END `nivel`, T.* FROM (
  5.     -> SELECT
  6.     -> YEAR(fecha) `año`, MONTH(fecha) `mes`, DAY(fecha) `dia`,
  7.     -> SUM(cantidad) total
  8.     -> FROM tabla
  9.     -> GROUP BY `año`, `mes`, `dia`
  10.     -> WITH ROLLUP) T
  11.     -> ORDER BY `año`, `mes`, `nivel`, `dia`;
  12. +-------+------+------+------+-------+
  13. | nivel | año  | mes  | dia  | total |
  14. +-------+------+------+------+-------+
  15. |     1 | NULL | NULL | NULL |   112 |
  16. |     1 | 2011 | NULL | NULL |    38 |
  17. |     2 | 2011 |    2 | NULL |    38 |
  18. |     3 | 2011 |    2 |   12 |    17 |
  19. |     3 | 2011 |    2 |   28 |    21 |
  20. |     1 | 2012 | NULL | NULL |    74 |
  21. |     2 | 2012 |    2 | NULL |    30 |
  22. |     3 | 2012 |    2 |    1 |    10 |
  23. |     3 | 2012 |    2 |    2 |    20 |
  24. |     2 | 2012 |    3 | NULL |    44 |
  25. |     3 | 2012 |    3 |    5 |    32 |
  26. |     3 | 2012 |    3 |    7 |    12 |
  27. +-------+------+------+------+-------+
  28. 12 rows in set (0.02 sec)

La enorme diferencia es que es una sola consulta (no utilizas uniones) y además te calcula las sumas POR CADA NIVEL DE DESAGREGACIÓN, es decir, el total-total, el total por año y el total por mes. El CASE-WHEN tiene las misma función de ordenación de los datos.

Espero que realmente te tomes un tiempo para analizar y comentar este ejercicio y nos digas si te sirvió o no.

Saludos
Leo.