Допустим, у меня есть следующие таблицы:

1 - StartingStock :

vendor | starting_stock
------------------------
adidas |    13
Reebok |    5

2 - Пополнение запасов :

vendor | restocks
-----------------
adidas |    2
nike   |    3

3 - Продажи .

vendor | quantity_sold
----------------------
adidas |    10
nike   |    1

Я хочу, чтобы полученная в результате таблица была сгруппирована по поставщикам. В этом случае продажа через рассчитывается следующим образом: quantity_sold/(starting_stock + restocks). Моя единственная проблема заключается в том, что в таблицах начального запаса и запаса могут отсутствовать некоторые поставщики, присутствующие в таблице продаж. Таким образом, в приведенном выше сценарии StartingStock не имеет nike в качестве записи. Так что если это так, то продажа для nike будет просто 1/3 или 1/(3+0). Поэтому моя итоговая таблица будет такой:

vendor | sell_through
---------------------
adidas |    1.5
nike   |   0.33
Reebok |    0

Поэтому я бы хотел, чтобы все поставщики присутствовали в таблице результатов (если в ней нет продаж, значение равно 0, как показано выше для Reebok).

Я пытался работать с различными типами объединений, но я не мог получить это. Любая помощь будет отличной. Спасибо.

2
tee 21 Июл 2020 в 06:18

2 ответа

Лучший ответ

Мы можем попробовать полный подход внешнего соединения здесь:

SELECT
    COALESCE(ss.vendor, r.vendor, s.vendor) AS vendor,
    COALESCE(s.quantity_sold, 0) /
        (COALESCE(ss.starting_stock, 0) + COALESCE(r.restocks, 0)) AS sell_through
FROM StartingStock ss
FULL OUTER JOIN Restock r ON ss.vendor = r.vendor
FULL OUTER JOIN Sales s ON s.vendor = COALESCE(ss.vendor, r.vendor)

демонстрация

Обратите внимание, что у меня есть 2/3 для продажи через Adidas, поскольку проданное количество составляет 10, а сумма акций - 15.

2
Tim Biegeleisen 21 Июл 2020 в 03:23

Я бы использовал union all и агрегацию:

select vendor,
       sum(starting_stock), sum(restock), sum(quantity_sold),
       (sum(quantity_sold) * 1.0 / sum(starting_stock) + sum(restock)) as sell_through
from ((select vendor, starting_stock, 0 as restock, 0 as quantity_sold
       from startingstock
      ) union all
      (select vendor, 0 as starting_stock, restock, 0 as quantity_sold
       from restock
      ) union all
      (select vendor, 0 as starting_stock, 0 as restock, quantity_sold
       from sales
      ) 
     ) v
group by vendor;

В частности, эта версия включает каждое число в расчет только один раз. Подход JOIN даст неточные результаты, если поставщик имеет несколько строк в любой из таблиц.

1
Gordon Linoff 21 Июл 2020 в 12:32