Счетчик SQL в представлении в виде столбца - PullRequest
8 голосов
/ 27 марта 2010

Я пытаюсь получить результат COUNT в виде столбца на мой взгляд. Пожалуйста, посмотрите запрос ниже для демонстрации того, что я хочу (это только для демонстрационных целей)

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

Это, очевидно, не работает ... но мне было интересно, каким будет правильный способ сделать это?

Я использую SQL Server

Ответы [ 4 ]

8 голосов
/ 27 марта 2010

Ваш запрос будет действительно работать, если вы удалите объединение - оно на самом деле не используется, и это приведет к конфликту таблицы ord в внутреннем подзапросе select с таблицей ord, к которой вы присоединились:

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

В качестве альтернативы, вы можете использовать объединенную таблицу вместе с 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 голосов
/ 27 марта 2010

Попробуйте это:

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 голос
/ 27 марта 2010

Если вас интересуют только те продукты, которые были заказаны, вы можете просто заменить операцию LEFT OUTER JOIN на 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 голосов
/ 27 марта 2010

Это будет работать:

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

Предложение "COUNT (ord.ProductId)" гарантирует, что в случае отсутствия ордеров TotalNumberOfOrders будет равно нулю.

[Позднее редактирование: я забыл предложение GROUP BY. Doh!]

...