SQL Server группа по поглощению пустых и пустых значений - PullRequest
1 голос
/ 06 марта 2019

У меня есть эти данные:

Id  Name     amount    Comments 
-------------------------------
1     n1     421762    Hello    
2     n2        421    Bye      
3     n2        262    null     
4     n2       5127    ''  

Каждое имя может иметь или не иметь дополнительные строки с пустыми или пустыми комментариями.

Как группировать по имени и сумме (количеству) такихчто он игнорирует / поглощает нулевые или пустые комментарии в группировке и показывает мне только 2 группы.

Вывод, который я хочу:

Id   Name     sum(amount)   Comments 
------------------------------------
1     n1         421762     Hello    
2     n2           5180     Bye 

Я не могу понять это.

Я надеялся, что это игнорирует пустые / пустые значения, но я всегда получаю 4 группы

select id, name, sum(amount), comments 
from table 
group by id, name, comments

Ответы [ 4 ]

2 голосов
/ 06 марта 2019

Просто используйте MAX() с comments:

select id, name, sum(amount), MAX(comments) 
from table 
group by id, name;
1 голос
/ 06 марта 2019

Вы не можете иметь поле в операторе 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
1 голос
/ 06 марта 2019
Select Top 1 with Ties
       ID 
      ,Name
      ,Amount = sum(Amount) over (Partition By Name)
      ,Comments = max(Comments) over (Partition By Name)
from YourTable
Order by Row_Number() over (Partition By Name Order by ID)

Возвращает

ID  Name    Amount  Comments
1   n1      421762  Hello
2   n2      5810    Bye
1 голос
/ 06 марта 2019

использование row_number()

  select id,name,comments,amount from 
     (select id,name,
     row_number() over(partition by Name  order by  case when Comments is not null then 1 else 2 end) rn,
       sum(amount) over(partition by Name) as amount,comments
   from table_name
      ) a where a.rn=1
...