質問

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の場合にも機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top