Почему запрос SQL не проходит без GROUP BY?

Вот сам "правильный" запрос, с group by.
SELECT 
  order_id, 
  SUM(price * amount) AS order_price 
FROM 
  positions 
  JOIN products ON products.id = positions.product_id 
GROUP BY 
  positions.order_id

Но если сделать так:
SELECT 
  order_id, 
  SUM(price * amount) AS order_price 
FROM 
  positions 
  JOIN products ON products.id = positions.product_id

Выходит ошибка:
SQL Error [42803]: ОШИБКА: столбец "positions.order_id" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
  Позиция: 11

Позиция ошибки: line: 2 pos: 10
  • Вопрос задан
  • 1422 просмотра
Решения вопроса 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Потому что это азы SQL: если в выражении есть и агрегирующая функция, и просто неагрегируемые значения, то необходимо явным образом указать, что нужно по ним группировать.
Ответ написан
Alex_Geer
@Alex_Geer
System Engineer
При использовании функций агрегации (например, SUM) в запросе и одновременном указании полей, которые не являются частью функций агрегации (например, positions.order_id), необходимо указывать эти поля в GROUP BY.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы не указали GROUP BY, но использовали агрегирующую функцию SUM. Такая комбинация эквивалентна агрегации всей выборки в одну строку. Однако, вы выбираете поле order_id. У СУБД возникает вопрос - а из какой именно строки брать значение этого поля в итоговую выборку? Скажем, после фильтрации осталось 10 строк с разными order_id. Какое именно из этих 10 значений вы хотите увидеть после агрегации?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы