如何在Oracle SQL中实现累计列值打印与全量拼接输出?
用SQL实现两种字符串聚合需求
原始数据集
假设数据存储在表test_table中,结构与数据如下:
SELECT col1, col2 FROM test_table; -- 输出结果 col1 | col2 -----|----- A | 1 B | 2 C | 3 D | 4
需求1:逐行累积拼接字符串
目标输出
A 1 A1 B 2 A1,B2 C 3 A1,B2,C3 D 4 A1,B2,C3,D4
SQL实现(主流数据库示例)
MySQL 8.0+
利用窗口函数版GROUP_CONCAT实现累积拼接:
SELECT col1, col2, GROUP_CONCAT(CONCAT(col1, col2) ORDER BY col1 SEPARATOR ',') OVER (ORDER BY col1) AS concat_result FROM test_table;
PostgreSQL
使用窗口化的STRING_AGG函数:
SELECT col1, col2, STRING_AGG(CONCAT(col1, col2), ',' ORDER BY col1) OVER (ORDER BY col1) AS concat_result FROM test_table;
SQL Server
通过FOR XML PATH结合子查询实现累积拼接:
SELECT t1.col1, t1.col2, STUFF( (SELECT ',' + CONCAT(t2.col1, t2.col2) FROM test_table t2 WHERE t2.col1 <= t1.col1 ORDER BY t2.col1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS concat_result FROM test_table t1 ORDER BY t1.col1;
需求2:全局统一拼接字符串
目标输出
A 1 A1,B2,C3,D4 B 2 A1,B2,C3,D4 C 3 A1,B2,C3,D4 D 4 A1,B2,C3,D4
SQL实现(通用方案)
先全局聚合得到完整拼接字符串,再与原表关联返回每行数据:
MySQL
SELECT t.col1, t.col2, global_concat.concat_result FROM test_table t CROSS JOIN ( SELECT GROUP_CONCAT(CONCAT(col1, col2) ORDER BY col1 SEPARATOR ',') AS concat_result FROM test_table ) global_concat;
PostgreSQL
SELECT t.col1, t.col2, global_concat.concat_result FROM test_table t CROSS JOIN ( SELECT STRING_AGG(CONCAT(col1, col2), ',' ORDER BY col1) AS concat_result FROM test_table ) global_concat;
SQL Server
SELECT t.col1, t.col2, global_concat.concat_result FROM test_table t CROSS JOIN ( SELECT STUFF( (SELECT ',' + CONCAT(col1, col2) FROM test_table ORDER BY col1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS concat_result ) global_concat;
内容的提问来源于stack exchange,提问作者user27817415
相关产品推荐
相关产品推荐

