2008-10-28 36 views
5

Tôi có hai bảng, một bảng lưu trữ các sản phẩm và số lượng chúng tôi đã mua, cửa hàng kia bán hàng. Do đó, cổ phiếu hiện tại là tổng của tất cả các cột số lượng trong bảng đã mua trừ đi số lượng hàng trong bảng bán. Làm thế nào điều này có thể được thể hiện trong MySQL. Hãy nhớ rằng có nhiều sản phẩm khác nhau.Tìm sự khác biệt về số hàng của hai bảng trong MySQL

CHỈNH SỬA: Để làm cho khó hơn, tôi có một yêu cầu khác. Tôi có bảng đã mua, bảng đã bán, nhưng tôi cũng có bảng sản phẩm. Tôi muốn một danh sách tất cả các sản phẩm, và tôi muốn biết số lượng có sẵn của mỗi sản phẩm. Vấn đề với câu trả lời hiện tại là họ chỉ trả lại các sản phẩm mà chúng tôi đã bán hoặc đã mua. Tôi muốn tất cả các sản phẩm.

+0

tổng http://stackoverflow.com/questions/826365/how-do-i-add-two-count-results-together-on-two-different-tables –

Trả lời

6

Hãy thử điều này


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) 

Đây là một giải pháp tốt hơn so với một vài trong số những người khác được đăng, mà không chiếm thực tế là một số sản phẩm có thể không có bất kỳ hàng tương ứng trong bảng doanh thu. Bạn muốn đảm bảo rằng các sản phẩm đó cũng hiển thị trong kết quả.

NVL là một hàm cụ thể của Oracle trả về giá trị của đối số đầu tiên, trừ khi nó là null, trong trường hợp này nó trả về giá trị của đối số thứ hai. Có các hàm tương đương trong tất cả các DBMS thương mại - bạn có thể sử dụng CASE trong MySQL để có cùng tác dụng.

+0

Tôi nghĩ bạn có nghĩa là inv_t.product trên dòng đầu tiên. – Marius

+0

Ngoài ra, nó không hiển thị một sản phẩm chưa được bán. – Marius

+0

Cảm ơn bạn đã nắm bắt, cố định. Nó cho thấy một sản phẩm chưa được bán, đó là lý do tại sao nó là một sự tham gia bên ngoài. Tôi đã thêm một cuộc gọi nvl(), để làm rõ rằng đây là những gì nên xảy ra. – SquareCog

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; 

Cái này cũng hoạt động khi số lượng bán ra là 0.

0

Tôi đề nghị làm "hàng tồn kho" và "bán hàng" bảng thành quan điểm, để họ được tái sử dụng và truy vấn chính thức trở nên rất đơn giản . Rõ ràng tên trường và bảng sẽ cần phải thay đổi để phù hợp với lược đồ của bạn.

--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; 
Các vấn đề liên quan