Вы не можете иметь поле в операторе SELECT
, если оно не является частью предложения GROUP BY или не используется для агрегирования.Вопрос и желаемый результат показывают, что строки должны быть сгруппированы по имени, что означает, что все остальные поля (ID, количество, комментарии) должны быть агрегированы.
В вопросе не указано как идентификаторы должны быть агрегированы, или какие комментарии должны появиться.Агрегирование строк возможно только с использованием функций, таких как MIN / MAX, во всех версиях SQL Server до 2016 года. SQL Server 2017 добавил STRING_AGG для объединения строк.В более ранних версиях люди должны использовать один из многих методов агрегирования строк, которые могут включать функции XML или SQLCLR.
В версиях SQL Server требуемый вывод может быть получен с помощью
SELECT MIN(ID) as ID,name,sum(amount) as Amount, max(comment) as comments
from #table1
group by name
.желаемый результат:
ID name Amount comments
1 n1 421762 Hello
2 n2 5810 Bye
Предполагается, что есть только один непустой комментарий.Вопрос не определяет что-то другое, хотя.
В SQL Server 2017 можно объединить несколько комментариев с помощью STRING_AGG:
SELECT MIN(ID) as ID,name,sum(amount) as Amount, STRING_AGG(comment,' ') as comments
from table1
group by name
Учитывая данные вопроса, это также даст желаемый результат.
ID name Amount comments
1 n1 421762 Hello
2 n2 5810 Bye