Obtener Valores De Un Período De Tiempo Este Año Y Un Año Anterior

by ADMIN 67 views

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:

  1. Se seleccionan las sucursales y se unen con la tabla ventas utilizando el campo sucursal.
  2. Se filtran las ventas para que solo se incluyan las fechas que sean 6 meses o menos antes de la fecha actual.
  3. Se utiliza la función CASE para sumar las ventas de cada sucursal para el año actual y el año anterior.
  4. Se agrupa los resultados por sucursal.
  5. 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