SQL - как объединить 3 таблицы, но только сгруппировать по столбцам из двух - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь объединить 3 таблицы ниже вместе, но я хочу сгруппировать только по customer_ID В первых 2 таблицах, как этого добиться?
Другими словами, третья таблица, которую я использую, предназначена только для исключения записей. Большое спасибо!

Таблица 1

customer_ID  product_No  
 100          ABC001
 100          ABC111
 100          ABC112 
 200          ABC002

table2

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 и получить только значение ABC111 для клиента 100, поскольку это действительный продукт с максимальной суммой?

таким образом, результат будет Customer_ID 100 Amount 60 Цель состоит в том, чтобы получить максимальное количество продукта (только если продукт находится в 3-ей таблице с дескриптором Y) под клиентом.

Ответы [ 5 ]

0 голосов
/ 03 сентября 2018

Вы хотите знать, существует ли продукт в таблице 3. Мы проверяем существование в SQL с помощью EXISTS или IN.

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 голосов
/ 03 сентября 2018

Для вашей выходной выборки достаточно простой агрегатной функции и объединения

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
0 голосов
/ 03 сентября 2018

Это просто еще одно объединение и предложение WHERE, фильтрующее t3.desc. Похоже, вам не нужны столбцы из 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. Oracle поддерживает это с 9i (уже двадцать лет), и это действительно облегчает чтение запросов.

0 голосов
/ 03 сентября 2018

Попробуйте ниже с использованием 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
0 голосов
/ 03 сентября 2018

Если для каждого покупателя требуется действительный продукт с максимальной суммой, используйте 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;
...