You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何基于parentid字段将多行数据转置为单行展示

实现方案

这个需求属于分组字符串聚合,不同数据库对应的内置聚合函数不同,以下是主流数据库的实现方式,假设你的表名为t_example,包含id、name、parentid三个字段:

MySQL 实现

MySQL用GROUP_CONCAT函数,默认分隔符是逗号,支持自定义分隔符:

SELECT 
  parentid,
  GROUP_CONCAT(id ORDER BY id SEPARATOR ',') AS ids,
  GROUP_CONCAT(name ORDER BY id SEPARATOR ',') AS names
FROM t_example
GROUP BY parentid;

注意:如果合并的内容太长超过默认长度限制,可以先执行SET group_concat_max_len = 102400;调整最大长度阈值。

PostgreSQL 实现

PostgreSQL用STRING_AGG函数:

SELECT 
  parentid,
  STRING_AGG(id::VARCHAR, ',' ORDER BY id) AS ids,
  STRING_AGG(name, ',' ORDER BY id) AS names
FROM t_example
GROUP BY parentid;

SQL Server 实现

SQL Server 2017及以上版本支持STRING_AGG:

SELECT 
  parentid,
  STRING_AGG(id, ',') WITHIN GROUP (ORDER BY id) AS ids,
  STRING_AGG(name, ',') WITHIN GROUP (ORDER BY id) AS names
FROM t_example
GROUP BY parentid;

低版本SQL Server可以用FOR XML PATH语法实现:

SELECT 
  t1.parentid,
  STUFF((SELECT ',' + CAST(id AS VARCHAR(10)) FROM t_example t2 WHERE t2.parentid = t1.parentid ORDER BY id FOR XML PATH('')),1,1,'') AS ids,
  STUFF((SELECT ',' + name FROM t_example t2 WHERE t2.parentid = t1.parentid ORDER BY id FOR XML PATH('')),1,1,'') AS names
FROM t_example t1
GROUP BY t1.parentid;

Oracle 实现

Oracle 11gR2及以上版本用LISTAGG函数:

SELECT 
  parentid,
  LISTAGG(id, ',') WITHIN GROUP (ORDER BY id) AS ids,
  LISTAGG(name, ',') WITHIN GROUP (ORDER BY id) AS names
FROM t_example
GROUP BY parentid;

内容的提问来源于stack exchange,提问作者unnikrishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:54:07