5

2 つのテーブルがあり、1 つは購入した製品と数量を格納し、もう 1 つは販売を格納します。したがって、現在の在庫は、buy テーブルのすべての数量列の合計から、sells テーブルの行数を引いたものになります。これはMySQLでどのように表現できますか。さまざまな製品があることを忘れないでください。

編集: それを難し​​くするために、別の要件があります。購入したテーブルと販売したテーブルがありますが、製品のテーブルもあります。すべての商品のリストが欲しいのですが、各商品の在庫数を知りたいです。現在の回答の問題は、販売または購入した製品のみを返品することです。全商品欲しいです。

4

3 に答える 3

6

これを試して


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)

これは、一部の製品が sales テーブルに対応する行を持たない可能性があるという事実を考慮していない、投稿された他のいくつかのものよりも優れたソリューションです。そのような製品も結果に表示されるようにする必要があります。

NVL は、最初の引数の値を返す Oracle 固有の関数です。null の場合は、2 番目の引数の値を返します。すべての商用 DBMS には同等の機能があります。MySQL で CASE を使用して同じ効果を得ることができます。

于 2008-10-28T12:18:05.560 に答える
0

「inventory」テーブルと「sales」テーブルをビューにすると、それらが再利用可能になり、最終的なクエリが非常にシンプルになります。明らかに、フィールドとテーブルの名前は、スキーマに合わせて変更する必要があります。

--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;
于 2008-10-28T13:24:36.050 に答える
0
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 の場合にも機能します。

于 2008-10-28T12:21:01.840 に答える