首页 > 解决方案 > 如何附加列,分组且不重复?

问题描述

我目前有一个数据集,每一行都应该代表一个项目的危险代码。有些物品多次具有相同的危险代码,因为它代表了内部商品的不同描述。

我的目标是将以下数据集转换为在该行中具有每个不同gkey但所有其各自和不同的imdg_classgkey

当前数据结果:

当前数据结果

所以在gkey=的情况下4524111,我希望imdg_class3, 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

标签: sqlappendsubstringconcatenationmultiple-columns

解决方案


一般来说,数据库支持某种字符串聚合功能。例如,它group_concat()在 MySQL 中被调用,你可以这样做:

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

在 Postgres 中,函数是string_agg(). 在 SQL Server 中也是如此。在 Oracle 中,它被称为listagg()-- 但不幸的是不会删除重复项,因此需要子查询。

string_agg()SQL Server 中的 in 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;

推荐阅读