Нахождение разницы в количестве строк двух таблиц в MySQL - PullRequest
5 голосов
/ 28 октября 2008

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

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

Ответы [ 3 ]

6 голосов
/ 28 октября 2008

Попробуйте это


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 функция, которая возвращает значение первого аргумента, если оно не равно нулю, и в этом случае возвращает значение второго аргумента. Во всех коммерческих СУБД есть эквивалентные функции - вы можете использовать CASE в MySQL для того же эффекта.

0 голосов
/ 28 октября 2008

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

--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;
0 голосов
/ 28 октября 2008
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...