简体   繁体   中英

SQL - Does row match max of sums

I am getting a little tripped up with a SQL query. Here is some background.

Schema:

Product(pid, price, color),
Order(cid, pid, quantity),
Customer(cid, name, age)

I want to get the pid of the most ordered product (greatest quantity).

I have managed to determine the max value with:

Select Max(total) 
From (Select Sum(quantity) as total 
      From Orders Group By pid) as Totals

but I am getting stuck trying to match which products are in this subquery. Here is what I have tried:

Select pid, SUM(quantity) as q 
From Orders 
Where q in (
    Select Max(total) 
    From (Select Sum(quantity) as total 
          From Orders 
          Group By pid) as Totals
    ) 
Group By pid

This says that q is an unknown column.

Any suggestions on how I could do this or do it better?

you can do a JOIN along with GROUP BY like

select p.*
from product p
join
(select pid from Order
 group by pid having quantity = max(quantity)
) tab on p.pid = tab.pid;

In your posted query it's erroring q is an unknown column cause q is a column alias which you are trying to use in WHERE condition; which is not allowed.

You should be able to simply include the PID in the original query because you are grouping on it. Then ORDER BY and and get only the top result using LIMIT 1 .

SELECT
    pid
   ,Sum(quantity) as total 
FROM
    Orders 
GROUP BY 
    pid
ORDER BY      
    Sum(quantity)
LIMIT 1

Here's one way you can do it using a subquery with limit :

select o.pid, sum(o.quantity)
from `order` o
group by o.pid
having sum(o.quantity) = 
(
    select sum(quantity) 
    from `order`
    group by pid
    order by sum(quantity) desc
    limit 1
)

If you want only one most ordered product, then Karl's answer is fine. If you want all that have the same quantity, then:

select pid, sum(quantity) as quantity
from orders o
group by pid
having sum(quantity) = (select max(quantity)
                        from (select sum(quantity) as quantity
                              from orders o
                              group by pid
                             ) q
                       );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM