2010-03-27 10 views
6

Próbuję uzyskać wynik z COUNT jako kolumna w moim widoku. proszę zobaczyć poniższe zapytanie do demo rodzaju co chcę (to tylko do celów demonstracyjnych)SQL Count in View as column

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 

To oczywiście nie działa ... ale ja zastanawiałem się co poprawny sposób robienia to byłoby?

Używam SQL Server

Odpowiedz

7

Zapytanie faktycznie działa, jeśli usunięte przyłączyć - to nie jest rzeczywiście używany, a to spowoduje tabelę ord w inner select subquery do konflikt z tabelą ord, które zostały połączone:

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

Alternatywnie, można rzeczywiście skorzystać z połączonej tabeli w połączeniu z 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

Spróbuj tego:

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

Jeśli jesteś zainteresowany tylko w produktach, które zostały zamówione, można po prostu zastąpić LEFT OUTER JOIN operację z 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

to będzie działać:

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 

Klauzula "COUNT (ord.ProductId)" zapewnia, że ​​jeśli nie zostaną znalezione żadne zamówienia, TotalNumberOfOrders będzie równa zero.

[Późniejsza edycja: Zapomniałem klauzuli GROUP BY. Doh!]