@SomeManEa

Почему не получается сгруппировать, отсортировать данные в таблице T-SQL?

Пытаюсь написать запрос на вывод данных клиента и общую стоимость его покупок, а также отсортировать, либо сгруппировать по фамилии, но мне выдает ошибку: "Msg 8120, Level 16, State 1, Line 21
Column 'clients.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
Делаю в MSSMS.

Пытался искать в интернете, из всех ответов я находил только то, что нужно в order by или group by вписывать все столбцы, которые вывожу, но какой смысл, если мне надо отсортировать/сгруппировать только 1 определенный столбец.

select clients.surname as Фамилия ,clients.Name as Имя,patronymic as Отчество,
((furnitures.UnitPrice*orders.UnitCount -(furnitures.UnitPrice*orders.UnitCount/100)*Discount+AssemblyCost+DeliveryCost))
as 'Общая стоимость'
from clients join orders on clients.id = orders.ClientsId
join furnitures on furnitures.id = orders.FurnitureId
Group by clients.Surname;


5fdca9b9661d1397601809.jpeg
  • Вопрос задан
  • 24 просмотра
Пригласить эксперта
Ответы на вопрос 2
@galaxy
Нельзя быть уверенным, не видя таблиц и данных, но суммирование, наверно, подразумевается:
select clients.surname as Фамилия ,clients.Name as Имя,patronymic as Отчество,
sum((furnitures.UnitPrice*orders.UnitCount -(furnitures.UnitPrice*orders.UnitCount/100)*Discount+AssemblyCost+DeliveryCost))
as 'Общая стоимость'
from clients join orders on clients.id = orders.ClientsId
join furnitures on furnitures.id = orders.FurnitureId
Group by clients.Surname, clients.Name, patronymic
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Нормальный SQL не дает стрелять себе в ногу и выше.
Поэтому при группировке все отображаемые поля должны фигурировать либо в условии группировки либо в агрегации.

Ну и при наличии client_id - группировать надо исключительно по нему, а производные от id фамилия, имя, отчество - тут придется слегка "обмануть" защиту от дурака:

select
Фамилия = min(clients.surname),
Имя = max(clients.Name),
[Ободран на сумму] = sum(.....) 
from clients 
left join orders on clients.id = orders.ClientsId
group by clients.id
order by min(clients.surname)


но более человеческий вариант с точки зрения логики - вначале группировать продажи по client_id и уже к получившемуся джойнить clients

впрочем интеллекта SQL вполне хватит спроектировать оптимальный план в любом случае
Ответ написан
Ваш ответ на вопрос

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

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