Не в агрегатной функции или группе по выражению: org.hsqldb. Expression@59bcb2b6 в выражении - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь сгруппировать SUM (OrderDetails.Quantity) , но продолжаю получать сообщение об ошибке Не в агрегатной функции или группе по предложению: org.hsqldb. Expression@59bcb2b6 в выражении но так как у меня уже есть часть GROUP BY, я не знаю, что мне не хватает

SQL Заявление:

SELECT OrderDetails.CustomerID, Customers.CompanyName, Customers.ContactName, SUM(OrderDetails.Quantity) 
FROM OrderDetails INNER JOIN Customers ON OrderDetails.CustomerID = Customers.CustomerID 
WHERE OrderDetails.CustomerID = Customers.CustomerID 
GROUP BY OrderDetails.CustomerID
ORDER BY OrderDetails.CustomerID ASC

Я пытаюсь создать таблицу, которая показывает клиентов и количество продуктов, которые они заказали, а также их CompanyName и ContactName.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Не берите идентификатор клиента из таблицы заказов. Возьми это со стола клиентов. Если вы это сделаете, это может работать в вашей базе данных:

SELECT c.CustomerID, c.CompanyName, c.ContactName, SUM(od.Quantity) 
FROM OrderDetails od INNER JOIN
     Customers c
     ON od.CustomerID = c.CustomerID 
GROUP BY c.CustomerID
ORDER BY c.CustomerID ASC;

Обратите внимание, что в предложении WHERE не нужно повторять условия в предложении ON.

Ваша версия не будет работать в стандартном SQL, потому что od.CustomerId не уникален в OrderDetails. Многие базы данных не поддерживают это, поэтому в них вам нужны дополнительные столбцы:

SELECT c.CustomerID, c.CompanyName, c.ContactName, SUM(od.Quantity) 
FROM OrderDetails od INNER JOIN
     Customers c
     ON od.CustomerID = c.CustomerID 
GROUP BY c.CustomerID, c.CompanyName, c.ContactName
ORDER BY c.CustomerID ASC;

Несмотря на это, намного, намного лучше взять все столбцы из одной таблицы. Это позволило бы оптимизатору SQL использовать индексы для Customers.

1 голос
/ 04 мая 2020

Напишите это:

GROUP BY OrderDetails.CustomerID, Customers.CompanyName, Customers.ContactName

В отличие от MySQL, PostgreSQL и стандартных SQL, в большинстве других SQL диалектов недостаточно группировать только по первичному ключу если вы также хотите проецировать функционально зависимые столбцы в предложении SELECT или в другом месте. Вы должны явно GROUP BY все столбцы, которые вы хотите проецировать.

...