我有兩個表:產品和訂單。訂單通過ProductID引用產品作爲外鍵。我想知道每件產品已售出多少次,包括僅售出一次的產品。我幾乎可以使用左連接來完成工作,但對於所有產品,仍然給出一行計數爲1,而不管它們是否存在於訂單表中。SQL Server:計算表B中發生ID的次數
有沒有辦法做到這一點,你會得到這樣的事情?
Product | Times sold
Milk | 5
Bread | 18
Cheese | 0
...等等。
我有兩個表:產品和訂單。訂單通過ProductID引用產品作爲外鍵。我想知道每件產品已售出多少次,包括僅售出一次的產品。我幾乎可以使用左連接來完成工作,但對於所有產品,仍然給出一行計數爲1,而不管它們是否存在於訂單表中。SQL Server:計算表B中發生ID的次數
有沒有辦法做到這一點,你會得到這樣的事情?
Product | Times sold
Milk | 5
Bread | 18
Cheese | 0
...等等。
如果你只是做一個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
我認爲這是目前的操作 – Lamak 2012-01-30 17:06:01
我的猜測是他正在做一個'left join',因此它顯示'products'沒有'orders',但他正在做一個'count(*)',所以它顯示它們的計數是1而不是0. – 2012-01-30 17:07:58
啊!我一直盯着查詢,沒有意識到我正在使用COUNT(*)而不是COUNT(ProductID) – 2012-01-30 17:10:00
喜歡的東西
Select Products.ProductName, Count(Orders.OrderID)
From Orders Inner join on Products Where Orders.ProductID = Products.ProductID
Group By Products.ProductName
@邁克爾是正確的。
如果你有一個數的順序表,將是這樣的:
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
如果您不希望產品沒有訂單退換,然後改變你的'LEFT JOIN'是一個'INNER JOIN相反。 – 2012-01-30 17:01:30
'LEFT JOIN'是正確的做法,特別是如果在你的例子中你想列出「奶酪」,這已經賣出零次 – Lamak 2012-01-30 17:02:15
如果你不想要沒有訂單的行,那麼爲什麼你的例子輸出顯示「奶酪| 0」? – ean5533 2012-01-30 17:03:46