SQL Fiddle:
CREATE TABLE Purchasing (
Event_Type VARCHAR(255),
Campaign VARCHAR(255),
Quantity_Offer VARCHAR(255),
Quantity_
Since by string comparison 'Offer' < 'Order' < 'Received', you can use the classic way with a group by subquery, to find the "latest" row:
select
p.Campaign,
p.Event_Type,
case p.Event_Type
when 'Order' then p.Quantity_Order
when 'Offer' then p.Quantity_Offer
when 'Received' then p.Quantity_Received
end as Quantity
from (
select Campaign, max(Event_Type) as Event_Type
from Purchasing
group by Campaign
) mx
natural join Purchasing p
order by p.Campaign
Result:
| Campaign | Event_Type | Quantity |
| -------- | ---------- | -------- |
| C001 | Received | 310 |
| C002 | Received | 190 |
| C003 | Order | 450 |
| C004 | Order | 630 |
| C005 | Offer | 400 |
| C006 | Offer | 300 |
View on DB Fiddle
But if you were not so lucky with your Event_Type values, or if you want a more solid (more reliable) solution, you would need to define a custom order with either FIELD(), FIND_IN_SET(), a case statement, or a sort mapping (derived) table. Here a way using FIELD():
select
p.Campaign,
p.Event_Type,
case p.Event_Type
when 'Order' then p.Quantity_Order
when 'Offer' then p.Quantity_Offer
when 'Received' then p.Quantity_Received
end as Quantity
from Purchasing p
where p.Event_Type = (
select p1.Event_Type
from Purchasing p1
where p1.Campaign = p.Campaign
order by field(p1.Event_Type, 'Offer', 'Order', 'Received') desc
limit 1
)
order by p.Campaign
View on DB Fiddle