2010-03-27 8 views
6

Estoy tratando de obtener el resultado de un COUNT como columna en mi vista. Por favor, vea la consulta a continuación para ver una demostración del tipo de cosas que quiero (esto es sólo para fines de demostración)Conteo de SQL en la vista como columna

SELECT 
    ProductID, 
    Name, 
    Description, 
    Price, 
    (SELECT COUNT(*) FROM ord WHERE ord.ProductID = prod.ProductID) AS TotalNumberOfOrders 

FROM tblProducts prod 
LEFT JOIN tblOrders ord ON prod.ProductID = ord.ProductID 

Esto, obviamente, no está funcionando ... pero me preguntaba cuál es la forma correcta de hacer ¿esto sería?

estoy usando SQL Server

Respuesta

7

Su consulta funcionaría realmente si ha quitado la unión - no se utiliza de hecho, y que hará que la tabla ord dentro del inner select subquery a conflicto con la tabla ord que se ha unido a:

SELECT 
    ProductID, 
    Name, 
    Description, 
    Price, 
    (SELECT COUNT(*) FROM ord WHERE ord.ProductID = prod.ProductID) AS TotalNumberOfOrders 
FROM tblProducts prod 

Alternativamente, en realidad se puede hacer uso de la tabla unida conjuntamente con Group By:

SELECT 
    ProductID, 
    Name, 
    Description, 
    Price, 
    COUNT(ord.ProductID) AS TotalNumberOfOrders 
FROM tblProducts prod 
LEFT JOIN tblOrders ord ON prod.ProductID = ord.ProductID 
GROUP BY 
    ProductID, 
    Name, 
    Description, 
    Price 
4

Prueba esto:

SELECT 
    ProductID, 
    Name, 
    Description, 
    Price, 
count(*) as totalnumberoforders 
FROM tblProducts prod 
LEFT JOIN tblOrders ord ON prod.ProductID = ord.ProductID 
group by 
    ProductID, 
    Name, 
    Description, 
    Price 
1

Si sólo está interesado en los productos que han sido ordenados, simplemente podría sustituir a la IZQUIERDA operación de combinación externa con un INNER JOIN:

SELECT 
    prod.ProductID, 
    prod.Name, 
    prod.Description, 
    prod. Price, 
    COUNT(*) AS TotalNumberOfOrders 
FROM tblProducts prod 
INNER JOIN tblOrders ord ON prod.ProductID = ord.ProductID 
0

Esto funcionará:

SELECT 
    ProductID, 
    Name, 
    Description, 
    Price, 
    COUNT(ord.ProductId) AS TotalNumberOfOrders 
FROM tblProducts prod 
LEFT JOIN tblOrders ord 
ON prod.ProductID = ord.ProductID 
GROUP BY 
    ProductID, 
    Name, 
    Description, 
    Price 

La cláusula "COUNT (ord.ProductId)" garantiza que si no se encuentran pedidos, TotalNumberOfOrders será igual a cero.

[Edición posterior: Olvidé la cláusula GROUP BY. Doh!]

Cuestiones relacionadas