WedX - журнал о программировании и компьютерных науках

Группа SQL Server, поглощающая нулевые и пустые значения

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

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

  • Вы тоже группируете по комментариям. Если вы не хотите этого, не добавляйте comments в предложение group by. 06.03.2019
  • просто добавьте предложение наличия после группы 06.03.2019
  • я хочу показать комментарии в окончательном операторе выбора 06.03.2019
  • Есть ли причина, по которой вы просто не устраняете их? where comments is not null and comments <> '' 06.03.2019
  • @heyNow какие комментарии? Все они? Некоторые из них? Вы можете использовать STRING_AGG в SQL Server 2017 для агрегирования (объединения) строк так же, как вы использовали бы, например, SUM() в числовом поле. Или вы можете использовать MIN/MAX, чтобы вернуть первый/последний комментарий 06.03.2019
  • @heyNow, какой идентификатор вы хотите отобразить? Ваш желаемый результат показывает, что вы хотите получить минимальный идентификатор для каждого имени. Это то, что вы хотите? 06.03.2019
  • Отредактированный вопрос. Я использую sql-сервер-2012. Каждое имя может иметь или не иметь дополнительные строки с нулевыми или пустыми комментариями. Идентификатор не так важен 06.03.2019
  • @heyNow Each name may or may not have extra rows в смысле? Что произойдет, если для одного имени есть три разных комментария, и один из них будет нулевым? Вы хотите отображать только один комментарий? Все комментарии? 06.03.2019
  • извините, эта часть должна была быть более ясной, будет только (1 комментарий и/или нулевой/пустой комментарий) для каждого имени, а не несколько разных ненулевых комментариев 06.03.2019
  • @heyNow, в этом случае подойдет простой MAX(comment), MIN(ID) 06.03.2019

Ответы:


1

У вас не может быть поля в операторе SELECT, если оно не является частью предложения GROUP BY или не используется для агрегирования. Вопрос и желаемый результат показывают, что строки должны быть сгруппированы по имени, что означает, что все остальные поля (идентификатор, количество, комментарии) должны быть агрегированы.

В вопросе не указано, как объединять идентификаторы или какие комментарии должны отображаться. Агрегирование строк возможно только с использованием таких функций, как 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
06.03.2019

2

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

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

3
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
06.03.2019

4

используйте 1_

  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
06.03.2019
  • Это не дает желаемый результат. Сумма должна суммироваться 06.03.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]