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+------------+----------+
| fecha | cantidad |
+------------+----------+
| 2012-02-01 | 10 |
| 2012-02-02 | 20 |
| 2012-03-05 | 32 |
| 2012-03-07 | 12 |
| 2011-02-12 | 17 |
| 2011-02-28 | 21 |
+------------+----------+
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 -> DAY(fecha
) `dia`, cantidad total
-> ORDER BY `año`, `mes`, `nivel`, `dia`; +-------+------+------+------+-------+
| nivel | año | mes | dia | total |
+-------+------+------+------+-------+
| 1 | 2011 | 2 | NULL | 38 | | 2 | 2011 | 2 | 12 | 17 |
| 2 | 2011 | 2 | 28 | 21 |
| 1 | 2012 | 2 | NULL | 30 | | 2 | 2012 | 2 | 1 | 10 |
| 2 | 2012 | 2 | 2 | 20 |
| 1 | 2012 | 3 | NULL | 44 | | 2 | 2012 | 3 | 5 | 32 |
| 2 | 2012 | 3 | 7 | 12 |
+-------+------+------+------+-------+
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 -> ORDER BY `año`, `mes`, `nivel`, `dia`; +-------+------+------+------+-------+
| nivel | año | mes | dia | total |
+-------+------+------+------+-------+
| 2 | 2011 | 2 | NULL | 38 | | 3 | 2011 | 2 | 12 | 17 |
| 3 | 2011 | 2 | 28 | 21 |
| 2 | 2012 | 2 | NULL | 30 | | 3 | 2012 | 2 | 1 | 10 |
| 3 | 2012 | 2 | 2 | 20 |
| 2 | 2012 | 3 | NULL | 44 | | 3 | 2012 | 3 | 5 | 32 |
| 3 | 2012 | 3 | 7 | 12 |
+-------+------+------+------+-------+
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.