2012-01-30 84 views
8

我有兩個表:產品和訂單。訂單通過ProductID引用產品作爲外鍵。我想知道每件產品已售出多少次,包括僅售出一次的產品。我幾乎可以使用左連接來完成工作,但對於所有產品,仍然給出一行計數爲1,而不管它們是否存在於訂單表中。SQL Server:計算表B中發生ID的次數

有沒有辦法做到這一點,你會得到這樣的事情?

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

...等等。

+2

如果您不希望產品沒有訂單退換,然後改變你的'LEFT JOIN'是一個'INNER JOIN相反。 – 2012-01-30 17:01:30

+2

'LEFT JOIN'是正確的做法,特別是如果在你的例子中你想列出「奶酪」,這已經賣出零次 – Lamak 2012-01-30 17:02:15

+0

如果你不想要沒有訂單的行,那麼爲什麼你的例子輸出顯示「奶酪| 0」? – ean5533 2012-01-30 17:03:46

回答

22

如果你只是做一個COUNT(*),那麼你將沒有訂單的產品計爲1 ...而是COUNT(o.OrderID),它只會計算非空的記錄OrderID

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

我認爲這是目前的操作 – Lamak 2012-01-30 17:06:01

+1

我的猜測是他正在做一個'left join',因此它顯示'products'沒有'orders',但他正在做一個'count(*)',所以它顯示它們的計數是1而不是0. – 2012-01-30 17:07:58

+0

啊!我一直盯着查詢,沒有意識到我正在使用COUNT(*)而不是COUNT(ProductID) – 2012-01-30 17:10:00

0

喜歡的東西

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

@邁克爾是正確的。

如果你有一個數的順序表,將是這樣的:

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