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