代码之家  ›  专栏  ›  技术社区  ›  Jonathan Livingston Seagull

选择产品A和B组合的订单

  •  -1
  • Jonathan Livingston Seagull  · 技术社区  · 6 年前

    我正在试图找出一个查询,它将获得一个订单列表,其中包含产品A和B、C和D、X和Y等的组合,因此我需要一个列表,它只显示具有指定组合的订单。类似下面的代码:

    select order_id, product_name
    from orders
    where product in( A & B, C & D)
    group by order_id
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    让我把你的问题解释为想要特定的产品对。如果是,您可以使用 group by having . 假设您的数据中没有重复项:

    select o.order_id
    from orders o 
    group by o.order_id
    having sum(case when o.product in ('A', 'B') then 1 else 0 end) = 2 or
           sum(case when o.product in ('C', 'D') then 1 else 0 end) = 2 or
           sum(case when o.product in ('X', 'Y') then 1 else 0 end) = 2;
    

    如果你想要的订单 然后添加条件 count(*) = 2。或者,如果你想变得深奥,你可以改变 else 像这样的 else 10 .

        2
  •  1
  •   Wei Lin    6 年前

    如果您的表数据

    | ORDER_ID | PRODUCT_NAME | PRODUCT |
    |----------|--------------|---------|
    |        1 |        xxx01 |     A、B |
    |        2 |        xxx02 |     B、C |
    |        3 |        xxx03 |     C、D |
    |        4 |        xxx04 |     D、X |
    |        5 |        xxx05 |     E、Z |
    

    尝试此脚本:

    select order_id,product_name ,product
    from orders 
    where product like ('%A%B%') 
    or product like ('%C%D%') 
    

    如果您的表数据像;

    | ORDER_ID | PRODUCT_NAME | PRODUCT |
    |----------|--------------|---------|
    |        1 |        xxx01 |       A |
    |        1 |        xxx02 |       B |
    |        2 |        xxx03 |       C |
    |        2 |        xxx04 |       D |
    |        3 |        xxx05 |       E |
    

    尝试此脚本:

    select order_id
    from orders 
    group by order_id having   
      count( case when product in ('A','B') then 1 else null end  ) > 1
      or 
      count( case when product in ('C','D') then 1 else null end  ) > 1