sql - 如何附加列,分组且不重复?
问题描述
我目前有一个数据集,每一行都应该代表一个项目的危险代码。有些物品多次具有相同的危险代码,因为它代表了内部商品的不同描述。
我的目标是将以下数据集转换为在该行中具有每个不同gkey
但所有其各自和不同的imdg_class
值gkey
:
当前数据结果:
所以在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
解决方案
一般来说,数据库支持某种字符串聚合功能。例如,它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;
推荐阅读
- python - 如何让 python 中的请求模块有一个时钟时间?
- mysql - SQL:同时获取组和计数
- post - 如何通过 GET 请求而不是 Vimeo API 中的 POST 请求进行操作?
- java - 调用 Web 服务 soap,错误 https URL 主机名与客户端信任库中服务器证书上的公用名 (CN) 不匹配
- python - 用反斜杠编码字符串的正确方法是什么?
- javascript - WooCommerce 插件开发:结帐“下订单”按钮不起作用。如何修复我的插件?
- javascript - 为什么等待的 Redux 动作创建者没有正确等待?(反应原生)
- dart - 如何停止 StatefulWidget 中的变量更改。?
- sql - BigQuery - SQL 日期函数,按月分组,跨越年份
- android - Google重置密钥后如何更新Android应用程序