Only display values of latest available event type

后端 未结 4 1222
南笙
南笙 2020-12-22 06:55

SQL Fiddle:

CREATE TABLE Purchasing (
    Event_Type VARCHAR(255),
    Campaign VARCHAR(255),
    Quantity_Offer VARCHAR(255),
    Quantity_         


        
4条回答
  •  无人及你
    2020-12-22 07:41

    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

提交回复
热议问题