如何编写SQL Server查询将相同行程编码的多行数据合并为单行

SQL实现同行程编码多行合并单行方案
实现逻辑
按行程编码trip_code分组,配合对应数据库的字符串聚合函数,将同一分组下多列的多个取值拼接为单个字符串输出。
不同数据库的实现语句
假设表名为trip_records,行程编码字段为trip_code,可根据实际表结构和需要合并的字段调整以下语句:
MySQL 8.0+/MariaDB
使用GROUP_CONCAT函数实现:
SELECT trip_code, GROUP_CONCAT(DISTINCT 乘客姓名字段 ORDER BY 乘客姓名字段 SEPARATOR ', ') AS 所有乘客, GROUP_CONCAT(DISTINCT 票号字段 ORDER BY 票号字段 SEPARATOR ', ') AS 所有票号, COUNT(*) AS 该行程总记录数 FROM trip_records GROUP BY trip_code;
PostgreSQL
使用STRING_AGG函数实现:
SELECT trip_code, STRING_AGG(DISTINCT 乘客姓名字段, ', ' ORDER BY 乘客姓名字段) AS 所有乘客, STRING_AGG(DISTINCT 票号字段, ', ' ORDER BY 票号字段) AS 所有票号, COUNT(*) AS 该行程总记录数 FROM trip_records GROUP BY trip_code;
SQL Server 2017及以上版本
使用STRING_AGG函数实现:
SELECT trip_code, STRING_AGG(DISTINCT 乘客姓名字段, ', ') WITHIN GROUP (ORDER BY 乘客姓名字段) AS 所有乘客, STRING_AGG(DISTINCT 票号字段, ', ') WITHIN GROUP (ORDER BY 票号字段) AS 所有票号, COUNT(*) AS 该行程总记录数 FROM trip_records GROUP BY trip_code;
Oracle 11gR2及以上版本
使用LISTAGG函数实现:
SELECT trip_code, LISTAGG(乘客姓名字段, ', ') WITHIN GROUP (ORDER BY 乘客姓名字段) AS 所有乘客, LISTAGG(票号字段, ', ') WITHIN GROUP (ORDER BY 票号字段) AS 所有票号, COUNT(*) AS 该行程总记录数 FROM trip_records GROUP BY trip_code;
如果需要对合并的内容去重,可先在子查询中对要合并的字段做去重处理后再执行聚合。
内容的提问来源于stack exchange,提问作者Kaushik Debnath
相关产品推荐
相关产品推荐

