Total vendido agrupado por mes – SQL y reportes con gráficas

En este post vamos a ver cómo calcular el total vendido en un período de fechas agrupado por mes, ya sea para mostrar un reporte o una gráfica de barras o líneas.

Básicamente veremos el algoritmo y ejemplos de código para sacar el desglose del total vendido por mes en el año o en cualquier período de tiempo, tomando los datos de una base de datos, agrupando, ordenando, sumando, etcétera.

No importa cuál motor de base de datos utilices ni el lenguaje de programación. Veremos el algoritmo para sumar el total vendido por mes.

Explicación del algoritmo

Necesitamos consultar la suma del total o monto agrupado por mes ordenado por mes. Para esto necesitamos haber guardado antes:

  1. El total o monto de la venta
  2. La fecha completa o el mes

Yo recomiendo guardar la fecha completa y luego obtener el mes, así podemos consultar esto por períodos, por ejemplo, el total vendido en un año pero agrupado por mes.

La consulta queda así:

select mes, sum(monto) from tabla group by mes;

Ahora veamos algunos ejemplos y cómo extraer el total de mes o presentarlo en el cliente.

Ejemplo con MySQL

Vamos a crear una tabla muy simple donde solo guardamos fecha y monto de la venta. En este caso no registramos la hora, solo la fecha. Creamos y llenamos la tabla:

Para obtener la suma de lo que se ha vendido en el año pero agrupado por mes la consulta quedaría así:

Con la siguiente salida mostrando el número de mes y la sumatoria de los montos, o el total recaudado:

Obviamente tú puedes ordenar por mes o total, además de obtener también el año. Una vez que tienes el número de mes ya puedes obtener el nombre del mismo o hacer cualquier otra cosa.

Ese ejemplo que te mostré fue con MySQL, y a partir de aquí puedes usar cualquier lenguaje de programación para ejecutar esa consulta. Sigue leyendo para ver cómo mostrar una gráfica con esos datos.

Ejemplo de total vendido agrupado por mes con SQLite 3

Veamos un ejemplo con SQLite3. Yo he dividido los datos, por un lado tengo órdenes (es decir, órdenes o pedidos de un sistema de restaurantes) y por el otro tengo los pagos.

Primero veamos las órdenes que es en donde se guarda la fecha:

Ahora veamos los pagos:

Los campos importantes aquí son monto de la tabla pagos, y fecha_solicitud de la tabla ordenes.

Como ya tengo la fecha, debo calcular el mes y eso se puede hacer en SQLite con strftime usando el formato %m entonces mi consulta queda así:

Por cierto, aquí uso coalesce en caso de que no haya ventas en ese mes, aunque sería poco probable porque si no hay ventas el mes ni siquiera aparecería; de igual manera lo dejo por buenas prácticas.

Estoy haciendo un inner join porque son dos tablas. Ya te mostré anteriormente un ejemplo más simple.

Nota importante: en este caso estoy filtrando las fechas para que solo sean del año 2023. Si tú usas otro formato de fechas tienes que cambiar el rango. Yo uso ese formato porque me permite comparar las cadenas lexicográficamente y luego crear objetos de tipo Date con JavaScript sin problemas.

Eso me dará una salida como la siguiente:

Ya tengo el número de mes y el total vendido en ese mes o mejor dicho; el mes y la suma de los totales de ese mes. Con esto ya podemos mostrar reportes y gráficas.

Bonus: mostrando datos en gráfica

Te voy a enseñar un ejemplo específico que yo uso para mostrar el total vendido en un año agrupado por mes usando datos de SQL y chart.js.

Yo uso Golang en el servidor. Mi función queda así:

Luego expongo eso en una API creada con gorilla/mux y la consumo con JavaScript:

Luego la obtengo en el lado del cliente y hago la gráfica convirtiendo el número de mes para que sea el label, y el total para que sea la data:

Con el siguiente resultado:

Ventas totales por mes en un año usando SQL

Espero que con estos ejemplos puedas crear tus propios reportes y gráficas.

Solo es cuestión de encontrar la consulta adecuada según tu motor de base de datos y luego mostrar esos datos de la manera que prefieras, ya sea en una tabla, en una gráfica de barras, circular o lo que tú prefieras.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario