SQL-如何连接3个表,但只按两个列分组

问题描述 投票:0回答:5

我试图加入下面的3个表,但我只想通过customer_ID分组在前2个表中,如何实现这一目标? 换句话说,我使用的第三个表只是为了消除记录。非常感谢!

表格1

customer_ID  product_No  
 100          ABC001
 100          ABC111
 100          ABC112 
 200          ABC002

表2

product_No   Amount
 ABC001        10
 ABC002        50
 ABC111        60
 ABC112        70

表3

Valid_Product  Desc
 ABC001         Y
 ABC111         Y

我可以通过这样做加入表1和表2

select 
    t1.product_No, Max(t2.amount)
from 
    t1, t2
where 
    t1.product_No = t2.product_No
group by 
    customer_ID

现在,我如何在同一个查询中加入表3,只获取客户100的ABC111值,因为这是具有最大金额的有效产品?

因此结果将是Customer_ID 100 Amount 60目标是在客户下获得产品的最大数量(仅当产品在desc Y的第3个表中)。

sql oracle join group-by max
5个回答
1
投票

它只是t3.desc上的另一个连接和WHERE子句过滤。看起来你不需要在投影中使用T3的列。

select t1.customer_ID, Max(t2.amount)
from t1
     join t2
     on t1.product_No = t2.product_No
     join t3
     on t1.product_No = t3.valid_product
where t3.desc = 'Y'
Group by t1.customer_ID

顺便提一下,您会注意到我使用ANSI 92连接语法编写了查询。自9i(现在已有20年)以来,Oracle一直支持这一点,它确实使查询更容易阅读。


1
投票

如果您希望每个客户都拥有最大金额的有效产品,请使用row_number()

select *
from (select t1.*, t2.amount,
             row_number() over (partition by t1.customer_id t2.amount desc) as seqnum
      from t1 join
           t2
           on t1.product_No = t2.product_No join
           t3
           on t3.Valid_Product = t1.product_No
     ) t
where seqnum = 1;

1
投票

对于您的输出示例,简单的聚合函数和连接就足够了

select t1.*,t2.Amount from table1 t1 join

 (
 select * from table2 t2 where amount in
   ( 
    select max(Amount) as amt
   from table2 inner join table3 t3 on 
    t2.product_No=t3.Valid_Product

   )  
  ) t2 on t1.product_No=t2.product_No

1
投票

您想知道表3中是否存在产品。我们使用EXISTSIN检查SQL中是否存在。

select 
  t1.customer_id, max(t2.amount)
from t2
left join t2 on  t2.product_no = t1.product_no
where t1.product_no in (select product_no from t3 where desc = 'Y')
group by t1.customer_id
order by t1.customer_id;

当您只查找表是否存在条目时,请不要加入。


0
投票

使用row_number()尝试下面

select * from 
(select customer_ID,t1.product_No, t2.amount, row_number() over (partition by customerid order by amount desc) as rn
from t1 inner join t2
where t1.product_No = t2.product_No)a
inner join table3 on a.product_no = Valid_Product
where rn=1
© www.soinside.com 2019 - 2024. All rights reserved.