Tengo una tabla con los precios y quiero devolver al cliente que gastó más dinero en los artículos. Mi consulta funciona, pero en caso de que tenga varios clientes con la misma cantidad de dinero gastado (máximo), no mostrará a ambos, sino solo uno.

La consulta es la siguiente:

SELECT u.FirstName,u.LastName,CustomerMail,max(Amount) from 
(select CustomerMail, sum(Price) as Amount from Ticket
group by CustomerMail),User u where CustomerMail = u.Email;

¿Alguien sabe cómo puedo devolver a todos los clientes en caso de que haya varios que gastaron la cantidad exacta como el otro?

¡Gracias de antemano!

-1
PersianAssassin 22 feb. 2020 a las 14:40

2 respuestas

La mejor respuesta

Utilice la función de ventana RANK():

select FirstName, LastName, Email, amount
from (
  select u.FirstName, u.LastName, u.Email, sum(t.Price) amount,
    rank() over (order by sum(t.Price) desc) rn 
  from User u inner join Ticket t
  on t.CustomerMail = u.Email
  group by u.FirstName, u.LastName, u.Email
)
where rn = 1  

RANK() asignará un número para cada suma en orden descendente y si 2 o más sumas son iguales, se les asignará el mismo número.
Finalmente, todo lo que necesitas son las sumas con rango = 1.

0
forpas 22 feb. 2020 a las 12:29

Hay varias cosas que debe aprender sobre SQL:

  • El uso de JOIN.
  • El uso de alias de tabla.
  • GROUP BY.

Está utilizando una "funcionalidad extendida" en SQLite al mezclar funciones de agregación y columnas no agregadas en la consulta externa. Esta sería una consulta rota, sintácticamente incorrecta en casi cualquier otra base de datos.

La forma canónica de resolver su problema utiliza funciones de ventana:

select u.FirstName, u.LastName, CustomerMail, sum_Amount
from (select t.CustomerMail, sum(t.Price) as sum_Amount,
             rank() over (order by sum(t.Price) desc) as seqnum    
      from Ticket t
      group by t.CustomerMail
     ) c join
     User u 
     ON t.CustomerMail = u.Email
where seqnum = 1;

Si solo desea una fila en caso de empate, entonces usaría row_number() en lugar de rank().

0
Gordon Linoff 22 feb. 2020 a las 12:18