Как выполнить агрегацию на NorthWind SQL Server? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь объединить таблицы NorthWind Products и Categories так, чтобы я мог получить список названий категорий продуктов с количеством продуктов в каждой категории

Код до сих пор пробовал:

SELECT 
    Categories.CategoryName, Categories.CategoryID
FROM 
    Categories 
LEFT JOIN 
    Products ON Products.CategoryID = Categories.CategoryID;

Над кодом показаны категории. Тем не менее, когда я выполняю группирование по идентификатору категории, появляется сообщение об ошибке

Столбец Categories.CategoryName недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY

Я не уверен, что не так.

Примечание. Я новичок в SQL Server

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Правильный синтаксис для GROUP BY:

SELECT c.CategoryName, c.CategoryID, COUNT(p.CategoryID)
FROM Categories c LEFT JOIN
     Products p
    ON p.CategoryID = c.CategoryID
GROUP BY c.CategoryName, c.CategoryID;

Обратите внимание, что здесь вводятся псевдонимы таблиц, которые упрощают написание и чтение запроса.

Все неагрегированные столбцыв SELECT находятся в GROUP BY.

0 голосов
/ 14 апреля 2019

После добавления GROUP BY вы больше не можете ссылаться ни на один элемент из исходного набора, кроме выражений, которые появляются в предложении GROUP BY, или агрегатной функции в любом другом. Причина в том, что после GROUP BY набор будет состоять из одной строки на группу, и единственное значение, которое гарантированно будет одинаковым, - это выражение GROUP BY. Для всех остальных столбцов вы должны гарантировать одно значение, и единственный способ сделать это - использовать агрегатную функцию - по определению она принимает набор значений и возвращает одно. Вот почему, если вы используете идентификатор категории GROUP BY, вы не можете ссылаться на название категории. так как в вашем случае они предполагаются функционально зависимыми, вы можете добавить оба к предложению GROUP BY или добавить фиктивный агрегат к имени категории.

SELECT Categories.CategoryName, Categories.CategoryID, COUNT(*) AS CountProducts
FROM   Categories 
       LEFT JOIN 
       Products 
       ON Products.CategoryID=Categories.CategoryID
GROUP BY Categories.CategoryName, Categories.CategoryID

OR

SELECT MAX(Categories.CategoryName) AS CategoryName, Categories.CategoryID, COUNT(*) AS CountProducts
FROM   Categories 
       LEFT JOIN 
       Products 
       ON Products.CategoryID=Categories.CategoryID
GROUP BY Categories.CategoryID
...