MySQLの2つのテーブルの行数の違いを見つける
質問
2つのテーブルがあり、1つは購入した製品と数量を格納し、もう1つは販売します。したがって、現在の在庫は、購入済みテーブルのすべての数量列の合計から販売済みテーブルの行数を引いたものです。これを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は、nullでない限り、最初の引数の値を返すOracle固有の関数であり、nullの場合、2番目の引数の値を返します。すべての商用DBMSには同等の機能があります。MySQLでCASEを使用して同じ効果を得ることができます。
他のヒント
「在庫」を作成することをお勧めします。および「販売」テーブルをビューに追加します。これにより、テーブルが再利用可能になり、最終的なクエリが非常に簡単になります。スキーマに合わせてフィールド名とテーブル名を変更する必要があることは明らかです。
--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の場合にも機能します。
所属していません StackOverflow