Как добавить столбцы, сгруппированные и без дубликатов? - PullRequest
0 голосов
/ 23 января 2019

В настоящее время у меня есть набор данных, каждая строка которого должна представлять опасный код предмета. Некоторые товары имеют один и тот же код опасности несколько раз, поскольку он представляет различные описания товаров внутри.

Моя цель состоит в том, чтобы преобразовать приведенный ниже набор данных для каждого отдельного gkey, но со всеми его соответствующими и отличными imdg_class значениями в этой строке gkey:

Текущий результат данных:

Current result of data

Так что в случае gkey = 4524111 я бы ожидал, что imdg_class будет иметь 3, 8.

Примечание: столбец imdg_class имеет следующий отдельный список значений

1.1B
1.1C
1.1D
1.2C
1.2E
1.2G
1.3C
1.3G
1.4B
1.4C
1.4G
1.4S
1.5D
2.1
2.2
2.3
3
4.1
4.2
4.3
5.1
5.2
6.1
6.2
7
8
9

Буду признателен за помощь.

РЕДАКТИРОВАТЬ:
Мои версии следующие:
Microsoft SQL Server Management Studio 14.0.17213.0
Microsoft Analysis Services Client Tools 14.0.1016.232
Microsoft Data Access Components (MDAC) 10.0.16299.15
Microsoft MSXML 3.0 4.0 6.0
Microsoft Internet Explorer 9.11.16299.0
Microsoft .NET Framework 4.0.30319.42000
Operating System 6.3.16299

1 Ответ

0 голосов
/ 23 января 2019

Как правило, базы данных поддерживают некоторую функцию агрегирования строк.Например, в MySQL он называется group_concat(), и вы можете просто сделать:

select gkey,
       group_concat(distinct imdg_class)
from t
group by gkey;

В Postgres функция - string_agg().То же самое в SQL Server.В Oracle он называется listagg() - но, к сожалению, не удаляет дубликаты, поэтому необходим подзапрос.

string_agg() в SQL Server доступен в SQL Server 2017+.До этого вы можете использовать версию XML:

select gkey,
       stuff( (select distinct ',' + imdg_class
               from t t2
               where t2.gkey = t.gkey
               for xml path('')
              ), 1, 1, ''
            )
from (select distinct gkey from t) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...