2012-01-30 28 views
8

Tengo dos tablas: productos y pedidos. Pedidos hace referencia a productos a través de ProductID como clave externa. Quiero saber cuántas veces se ha vendido cada producto, incluido el producto que se vende solo una vez. Casi puedo hacer que funcione usando una combinación de la izquierda, pero eso todavía da una fila con un recuento de uno para todos los productos, independientemente de si existen en la tabla de pedidos o no.Servidor SQL: Cuente el número de veces que aparece la ID de la tabla A en la tabla B

¿Hay alguna manera de hacer esto que te haga terminar con algo como esto?

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

... y así sucesivamente.

+2

Si no desea que los productos que no tienen pedidos devueltos, a continuación, cambiar su 'IZQUIERDA JOIN' para ser unirse a un' INTERIOR 'en cambio. –

+2

a 'LEFT JOIN' es lo correcto, especialmente si en su ejemplo desea incluir el "queso", que se ha vendido cero veces – Lamak

+0

Si no desea las filas que no tienen pedidos, ¿por qué su ejemplo? salida muestra "Queso | 0"? – ean5533

Respuesta

22

Si solo hace un COUNT(*), entonces está contando productos que no tienen pedidos como 1 ... en su lugar, COUNT(o.OrderID), que solo contará los registros que tienen un OrderID no nulo.

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

Creo que esto es lo que el operador está haciendo actualmente – Lamak

+1

Supongo que está haciendo un 'left join', para que se muestren' products' que no tienen 'orders', pero él está haciendo un' count (*) ', así que los muestra con un conteo de 1 en lugar de 0. –

+0

¡Ah! Me había quedado ciega en la consulta, sin darme cuenta de que estaba usando COUNT (*) en lugar de COUNT (ProductID) –

0

Algo así como

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

@ Michael es correcta.

Si usted tiene una tabla de orden con un recuento que se vería así:

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 
Cuestiones relacionadas