es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

obtenga la suma de registros distintos y compare entre dos rangos de fechas.

Tengo una tabla llamada “purchases”, con las columnas: nombre, cantidad, ciudad, fecha.

Quiero devolver la suma de la cantidad y ordenarla por ciudad con la mayor suma de cantidad, y comparar dos rangos de fechas.

Aquí está un ejemplo: http://sqlfiddle.com/#!9/6b2017/6

Puedo obtener el primer conjunto de ciudades con su suma(cantidad) ordenado por suma(cantidad) descendente (período 1):

select distinct city, sum(amount) as total
from purchases
where date between '2020-07-01' and '2020-10-31'
group by city
order by sum(amount) desc
limit 3

La consulta anterior devuelve las ciudades: Tulsa, Nueva York, Chicago

Pero también quiero obtener en la misma consulta, los 3 meses anteriores, pero con las mismas ciudades que se devolvieron en la consulta anterior, algo así, pero como mencioné, quiero que se devuelva en una sola consulta (período 2):

select city, sum(amount) as total
from purchases
where city in ('Tulsa', 'Nueva York', 'Chicago')
  and date between '2020-03-01' and '2020-06-31'
group by city

Busco devolver las ciudades (en el orden en que están en la primera consulta), con la suma(cantidad) para cada rango de fechas, por lo que en teoría:

Tulsa período 1: suma(cantidad)
Tulsa período 2: suma(cantidad)
Nueva York período 1: suma(cantidad)
Nueva York período 2: suma(cantidad)
Chicago período 1: suma(cantidad)
Chicago período 2: suma(cantidad)

Cualquier ayuda es apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado en una sola consulta, puede utilizar la agregación condicional con la declaración CASE. Aquí está la consulta modificada:

    SELECT city,
           SUM(CASE WHEN date BETWEEN '2020-07-01' AND '2020-10-31' THEN amount ELSE 0 END) AS total_periodo1,
           SUM(CASE WHEN date BETWEEN '2020-03-01' AND '2020-06-30' THEN amount ELSE 0 END) AS total_periodo2
    FROM purchases
    WHERE city IN ('Tulsa', 'Nueva York', 'Chicago')
    GROUP BY city
    ORDER BY total_periodo1 DESC
    

    Esta consulta utiliza dos instancias de la función SUM, cada una con una condición diferente dentro de la declaración CASE. La primera instancia calcula el monto total para el periodo 1 (entre el 1 de julio y el 31 de octubre). La segunda instancia calcula el monto total para el periodo 2 (entre el 1 de marzo y el 30 de junio). La cláusula WHERE limita el resultado a las tres ciudades devueltas en la primera consulta. Por último, el resultado se ordena por el monto total para el periodo 1 en orden descendente.

    Esta consulta debería proporcionarle la salida deseada con la suma de los montos para cada periodo y ciudad, ordenados por el monto total en el periodo 1 en orden descendente.

Comments are closed.