Поиск разницы в количестве строк в двух таблицах в MySQL

StackOverflow https://stackoverflow.com/questions/243035

  •  04-07-2019
  •  | 
  •  

Вопрос

У меня есть две таблицы, в одной хранятся продукты и количество, которое мы купили, в другой - количество проданных товаров.Таким образом, текущий запас представляет собой сумму всех столбцов количества в таблице "куплено" за вычетом количества строк в таблице "продано".Как это может быть выражено в MySQL?Помните, что существует много разных продуктов.

Редактировать: Чтобы усложнить задачу, у меня есть еще одно требование.У меня есть таблица "куплено", таблица "продано", но у меня также есть таблица "продукты".Мне нужен список всех продуктов, и я хочу знать доступное количество каждого продукта.Проблема с текущими ответами заключается в том, что они возвращают только те товары, которые мы уже продали или купили.Мне нужны все продукты.

Это было полезно?

Решение

Попробуй это


SELECT inv_t.product_id, inventory_total-nvl(sales_total,0)
FROM 
  (SELECT product_id, sum(quantity) as inventory_total
   FROM inventory
   GROUP BY product_id) inv_t LEFT OUTER JOIN
  (SELECT product_id, count(*) AS sales_total 
   FROM sales 
   GROUP BY product_id) sale_t
  ON (inv_t.product_id = sale_t.product_id)

Это лучшее решение, чем несколько других опубликованных, которые не учитывают тот факт, что у некоторых продуктов может не быть соответствующих строк в таблице продаж.Вы хотите убедиться, что такие продукты также отображаются в результатах.

NVL - это специфичная для Oracle функция, которая возвращает значение первого аргумента, если только оно не равно null, и в этом случае она возвращает значение второго аргумента.Эквивалентные функции есть во всех коммерческих СУБД - вы можете использовать CASE в MySQL с тем же эффектом.

Другие советы

Я предлагаю превратить таблицы "инвентарь" и "продажи" в представления, чтобы их можно было использовать повторно и конечный запрос стал очень простым.Очевидно, что имена полей и таблиц необходимо будет изменить, чтобы они соответствовали вашей схеме.

--First view: list products and the purchased qty
create or replace view product_purchases as
select
  product_id
 ,sum(purchased_qty) as purchased_qty
from
  purchases
group by
  product_id;

--Second view: list of products and the amount sold    
create or replace view product_sales as
select
  product_id
 ,count(*) as sales_qty
from
  sales
group by
  product_id;

--after creating those two views, run this query:
select
  pp.product_id
 ,pp.purchased_qty - ps.sales_qty as on_hand_qty
from
  product_purchases pp
 ,product_sales ps
where ps.product_id = pp.product_id;
SELECT product AS prd, 
SUM(quantity) - 
  IFNULL((SELECT COUNT(*)
   FROM sells
   WHERE product = prd 
   GROUP BY product), 0)
AS stock 
FROM bought
GROUP BY product;

Это также работает, когда количество проданных товаров равно 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top