Obtener Valores De Un Período De Tiempo Este Año Y Un Año Anterior
Introducción
En el mundo de la programación y la base de datos, a menudo necesitamos obtener valores de un período de tiempo específico, como los últimos 6 meses, y compararlos con el mismo período del año anterior. En este artículo, exploraremos cómo realizar esto utilizando MySQL, SQL y MariaDB.
Requisitos
Para seguir este artículo, necesitarás tener conocimientos básicos de SQL y acceso a una base de datos MySQL, SQL o MariaDB.
Ejemplo de consulta
Supongamos que tenemos una tabla llamada ventas
con las siguientes columnas:
Columna | Tipo de dato |
---|---|
id | int |
fecha | date |
sucursal | varchar |
ventas | decimal |
Nuestra consulta debe obtener las ventas de los últimos 6 meses y del mismo período del año anterior para cada sucursal.
Consulta para obtener valores de un período de tiempo este año y un año anterior
Para obtener los valores de un período de tiempo este año y un año anterior, podemos utilizar la siguiente consulta:
SELECT
s.sucursal,
SUM(CASE WHEN YEAR(f.fecha) = YEAR(CURDATE()) THEN f.ventas ELSE 0 END) AS ventas_este_año,
SUM(CASE WHEN YEAR(f.fecha) = YEAR(CURDATE()) - 1 THEN f.ventas ELSE 0 END) AS ventas_anterior
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
WHERE
f.fecha >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY
s.sucursal
ORDER BY
s.sucursal;
Explicación de la consulta
La consulta anterior utiliza la función CASE
para sumar las ventas de cada sucursal para el año actual y el año anterior. La función DATE_SUB
se utiliza para obtener la fecha 6 meses antes de la fecha actual.
Cómo funciona la consulta
La consulta funciona de la siguiente manera:
- Se seleccionan las sucursales y se unen con la tabla
ventas
utilizando el camposucursal
. - Se filtran las ventas para que solo se incluyan las fechas que sean 6 meses o menos antes de la fecha actual.
- Se utiliza la función
CASE
para sumar las ventas de cada sucursal para el año actual y el año anterior. - Se agrupa los resultados por sucursal.
- Se ordenan los resultados por sucursal.
Ejemplo de resultado
Supongamos que tenemos las siguientes ventas:
fecha | sucursal | ventas |
---|---|---|
2022-01-01 | A | 100 |
2022-02-01 | A | 200 |
2022-03-01 | A | 300 |
2022-04-01 | A | 400 |
2022-05-01 | A | 500 |
2022-06-01 | A | 600 |
2022-07-01 | A | 700 |
2022-08-01 | A | 800 |
2022-09-01 | A | 900 |
2022-10-01 | A | 1000 |
2022-11-01 | A | 1100 |
2022-12-01 | A | 1200 |
2023-01-01 | A | 1300 |
2023-02-01 | A | 1400 |
2023-03-01 | A | 1500 |
2023-04-01 | A | 1600 |
2023-05-01 | A | 1700 |
2023-06-01 | A | 1800 |
La consulta anterior devolvería los siguientes resultados:
sucursal | ventas_este_año | ventas_anterior |
---|---|---|
A | 1800 | 1200 |
Conclusión
En este artículo, hemos visto cómo obtener valores de un período de tiempo este año y un año anterior utilizando MySQL, SQL y MariaDB. La consulta que hemos utilizado es una forma eficiente de obtener los valores deseados y puede ser adaptada para diferentes necesidades.
Preguntas frecuentes
- ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 3 meses?
- ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre?
- ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes?
Respuestas
- Para obtener los valores de un período de tiempo específico, como los últimos 3 meses, puedes utilizar la función
DATE_SUB
para obtener la fecha 3 meses antes de la fecha actual. - Para obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, puedes utilizar la función
DATE_TRUNC
para truncar la fecha a trimestres. - Para obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes, puedes utilizar la función
DATE_TRUNC
para truncar la fecha a meses.
Preguntas y respuestas sobre obtener valores de un período de tiempo este año y un año anterior =====================================================================================
Pregunta 1: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 3 meses?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 3 meses, puedes utilizar la función DATE_SUB
para obtener la fecha 3 meses antes de la fecha actual. La consulta sería:
SELECT
s.sucursal,
SUM(CASE WHEN f.fecha >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH) THEN f.ventas ELSE 0 END) AS ventas_ultimo_trimestre
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
GROUP BY
s.sucursal;
Pregunta 2: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, puedes utilizar la función DATE_TRUNC
para truncar la fecha a trimestres. La consulta sería:
SELECT
s.sucursal,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 1 THEN f.ventas ELSE 0 END) AS ventas_1er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 2 THEN f.ventas ELSE 0 END) AS ventas_2do_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 3 THEN f.ventas ELSE 0 END) AS ventas_3er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 4 THEN f.ventas ELSE 0 END) AS ventas_4to_trimestre
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
WHERE
f.fecha >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
s.sucursal;
Pregunta 3: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes, puedes utilizar la función DATE_TRUNC
para truncar la fecha a meses. La consulta sería:
SELECT
s.sucursal,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 1 THEN f.ventas ELSE 0 END) AS ventas_enero,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 2 THEN f.ventas ELSE 0 END) AS ventas_febrero,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 3 THEN f.ventas ELSE 0 END) AS ventas_marzo,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 4 THEN f.ventas ELSE 0 END) AS ventas_abril,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 5 THEN f.ventas ELSE 0 END) AS ventas_mayo,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 6 THEN f.ventas ELSE 0 END) AS ventas_junio,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 7 THEN f.ventas ELSE 0 END) AS ventas_julio,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 8 THEN f.ventas ELSE 0 END) AS ventas_agosto,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 9 THEN f.ventas ELSE 0 END) AS ventas_septiembre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 10 THEN f.ventas ELSE 0 END) AS ventas_octubre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 11 THEN f.ventas ELSE 0 END) AS ventas_noviembre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 12 THEN f.ventas ELSE 0 END) AS ventas_diciembre
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
WHERE
f.fecha >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY
s.sucursal;
Pregunta 4: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, y agruparlos por sucursal?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, y agruparlos por sucursal, puedes utilizar la siguiente consulta:
SELECT
s.sucursal,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 1 THEN f.ventas ELSE 0 END) AS ventas_1er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 2 THEN f.ventas ELSE 0 END) AS ventas_2do_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 3 THEN f.ventas ELSE 0 END) AS ventas_3er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 4 THEN f.ventas ELSE 0 END) AS ventas_4to_trimestre
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
WHERE
f.fecha >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY
s.sucursal;
Pregunta 5: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes, y agruparlos por sucursal?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 6 meses, pero para cada mes, y agruparlos por sucursal, puedes utilizar la siguiente consulta:
SELECT
s.sucursal,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 1 THEN f.ventas ELSE 0 END) AS ventas_enero,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 2 THEN f.ventas ELSE 0 END) AS ventas_febrero,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 3 THEN f.ventas ELSE 0 END) AS ventas_marzo,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 4 THEN f.ventas ELSE 0 END) AS ventas_abril,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 5 THEN f.ventas ELSE 0 END) AS ventas_mayo,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 6 THEN f.ventas ELSE 0 END) AS ventas_junio,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 7 THEN f.ventas ELSE 0 END) AS ventas_julio,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 8 THEN f.ventas ELSE 0 END) AS ventas_agosto,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 9 THEN f.ventas ELSE 0 END) AS ventas_septiembre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 10 THEN f.ventas ELSE 0 END) AS ventas_octubre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 11 THEN f.ventas ELSE 0 END) AS ventas_noviembre,
SUM(CASE WHEN EXTRACT(MONTH FROM f.fecha) = 12 THEN f.ventas ELSE 0 END) AS ventas_diciembre
FROM
sucursales s
JOIN ventas f ON s.id = f.sucursal
WHERE
f.fecha >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY
s.sucursal;
Pregunta 6: ¿Cómo puedo obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, y agruparlos por sucursal y mes?
Respuesta: Para obtener los valores de un período de tiempo específico, como los últimos 12 meses, pero para cada trimestre, y agruparlos por sucursal y mes, puedes utilizar la siguiente consulta:
SELECT
s.sucursal,
EXTRACT(MONTH FROM f.fecha) AS mes,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 1 THEN f.ventas ELSE 0 END) AS ventas_1er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 2 THEN f.ventas ELSE 0 END) AS ventas_2do_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 3 THEN f.ventas ELSE 0 END) AS ventas_3er_trimestre,
SUM(CASE WHEN EXTRACT(QUARTER FROM f.fecha) = 4 THEN f.ventas ELSE 0