mysql sql zero monthcalendar not-exists

Venta mensual de MySQL de los Ășltimos 12 meses, incluidos los meses sin venta



zero monthcalendar (2)

Considere la siguiente tabla

mysql> select * from cart ; +------+------------+-------------+ | id | date | total_price | +------+------------+-------------+ | 1 | 2014-01-01 | 10 | | 2 | 2014-01-20 | 20 | | 3 | 2014-02-03 | 30 | | 4 | 2014-02-28 | 40 | | 5 | 2014-06-01 | 50 | | 6 | 2014-06-13 | 24 | | 7 | 2014-12-12 | 45 | | 8 | 2014-12-18 | 10 | +------+------------+-------------+

Ahora, según la lógica, está mirando hacia atrás un año y december aparecerá dos veces en el resultado, es decir, dec 2013 and dec 2014 y si necesitamos tener un recuento separado para ellos, entonces podemos usar la siguiente técnica de generación de rango dinámico de fechas MySql Single Tabla, seleccione los últimos 7 días e incluya filas vacías

t1.month, t1.md, coalesce(SUM(t1.amount+t2.amount), 0) AS total from ( select DATE_FORMAT(a.Date,"%b") as month, DATE_FORMAT(a.Date, "%m-%Y") as md, ''0'' as amount from ( select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c ) a where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month) group by md )t1 left join ( SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as amount ,DATE_FORMAT(date, "%m-%Y") as md FROM cart where Date <= NOW() and Date >= Date_add(Now(),interval - 12 month) GROUP BY md )t2 on t2.md = t1.md group by t1.md order by t1.md ;

La salida será

+-------+---------+-------+ | month | md | total | +-------+---------+-------+ | Jan | 01-2014 | 30 | | Feb | 02-2014 | 70 | | Mar | 03-2014 | 0 | | Apr | 04-2014 | 0 | | May | 05-2014 | 0 | | Jun | 06-2014 | 74 | | Jul | 07-2014 | 0 | | Aug | 08-2014 | 0 | | Sep | 09-2014 | 0 | | Oct | 10-2014 | 0 | | Nov | 11-2014 | 0 | | Dec | 12-2013 | 0 | | Dec | 12-2014 | 55 | +-------+---------+-------+ 13 rows in set (0.00 sec)

Y si no le importa el caso anterior, es decir, dec 2014 and dec 2013

Luego simplemente cambie el group by en la parte de fecha dinámica como

where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month) group by month

y grupo final por como group by t1.month

SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total FROM cart WHERE date <= NOW() and date >= Date_add(Now(),interval - 12 month) GROUP BY DATE_FORMAT(date, "%m-%Y")

Esta consulta muestra el resultado solo para el mes existente. Necesito todas las ventas de 12 meses.

Salida :

"month" "total" -------------- "Jun" "22" "Aug" "30" "Oct" "19" "Nov" "123" "Dec" "410"

Salida requerida :

"month" "total" -------------- "Jan" "0" "Feb" "0" "Mar" "0" "Apr" "0" "May" "0" "Jun" "22" "Jul" "0" "Aug" "30" "Sep" "0" "Oct" "19" "Nov" "123" "Dec" "410"


Gracias por la sugerencia de @pankaj, aquí lo resolví a través de esta consulta ...

SELECT SUM(IF(month = ''Jan'', total, 0)) AS ''Jan'', SUM(IF(month = ''Feb'', total, 0)) AS ''Feb'', SUM(IF(month = ''Mar'', total, 0)) AS ''Mar'', SUM(IF(month = ''Apr'', total, 0)) AS ''Apr'', SUM(IF(month = ''May'', total, 0)) AS ''May'', SUM(IF(month = ''Jun'', total, 0)) AS ''Jun'', SUM(IF(month = ''Jul'', total, 0)) AS ''Jul'', SUM(IF(month = ''Aug'', total, 0)) AS ''Aug'', SUM(IF(month = ''Sep'', total, 0)) AS ''Sep'', SUM(IF(month = ''Oct'', total, 0)) AS ''Oct'', SUM(IF(month = ''Nov'', total, 0)) AS ''Nov'', SUM(IF(month = ''Dec'', total, 0)) AS ''Dec'', SUM(total) AS total_yearly FROM ( SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total FROM cart WHERE date <= NOW() and date >= Date_add(Now(),interval - 12 month) GROUP BY DATE_FORMAT(date, "%m-%Y")) as sub