2012-01-30 43 views
8

Tôi có hai bảng: sản phẩm và đơn đặt hàng. Đơn đặt hàng tham chiếu sản phẩm qua ProductID dưới dạng khóa ngoại. Tôi muốn biết số lần mỗi sản phẩm đã được bán, bao gồm cả sản phẩm chỉ được bán một lần. Tôi gần như có thể làm cho nó hoạt động bằng cách sử dụng một phép nối trái, nhưng nó vẫn cho một hàng với một số cho tất cả các sản phẩm, bất kể chúng tồn tại trong bảng đơn hàng hay không.Máy chủ SQL: Đếm số lần ID từ bảng A xảy ra trong bảng B

Có cách nào để làm điều này mà sẽ khiến bạn kết thúc với một cái gì đó như thế này?

Product | Times sold 
Milk | 5 
Bread | 18 
Cheese | 0 

... v.v.

+2

Nếu bạn không muốn sản phẩm không có đơn đặt hàng trở lại, sau đó thay đổi của bạn 'LEFT JOIN' là một 'INNER JOIN 'thay vào đó. –

+2

'LEFT JOIN' là điều đúng đắn cần làm, đặc biệt nếu trong ví dụ bạn muốn liệt kê" pho mát ", đã được bán không lần – Lamak

+0

Nếu bạn không muốn các hàng không có đơn đặt hàng, thì tại sao ví dụ của bạn đầu ra hiển thị "Cheese | 0"? – ean5533

Trả lời

22

Nếu bạn chỉ làm một COUNT(*), sau đó bạn sẽ tính được sản phẩm mà không có đơn đặt hàng như 1 ... thay vào đó, COUNT(o.OrderID), mà sẽ chỉ đếm các hồ sơ có một tổ chức phi-null OrderID.

SELECT p.Product, COUNT(o.OrderID) 
FROM 
    Products p LEFT JOIN 
    Orders o ON o.ProductID = p.ProductID 
GROUP BY p.Product 
+0

Tôi nghĩ rằng đây là những gì op hiện đang làm – Lamak

+1

Tôi đoán là anh ấy đang thực hiện 'left join', để nó hiển thị' products' không có 'đơn đặt hàng', nhưng anh ta đang thực hiện' count (*) ', vì vậy nó hiển thị chúng với số lượng 1 thay vì 0. –

+0

Ah! Tôi đã nhìn chằm chằm bản thân mình mù trên truy vấn, không nhận ra tôi đã sử dụng COUNT (*) thay vì COUNT (ProductID) –

0

Something như

Select Products.ProductName, Count(Orders.OrderID) 
From Orders Inner join on Products Where Orders.ProductID = Products.ProductID 
Group By Products.ProductName 
0

@ Michael là đúng.

Nếu bạn có một bảng đơn đặt hàng với số đếm nó sẽ trông như thế này:

SELECT p.Product, SUM(ISNULL(o.ItemCount,0)) as [Count] 
FROM 
    Products p LEFT JOIN 
    Orders o ON o.ProductID = p.ProductID 
GROUP BY p.Product 
Các vấn đề liên quan