문제

나는 두 개의 테이블이 있고, 하나는 우리가 구입 한 제품과 수량을 저장하고, 다른 하나는 판매를 저장합니다. 따라서 현재 주식은 구매 된 테이블의 모든 수량 열의 합을 판매 테이블의 행 수를 뺀 것입니다. 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 특정 함수입니다.이 경우 두 번째 인수의 값을 반환합니다. 모든 상업용 DBMSE에는 동등한 기능이 있습니다. 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 일 때도 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top