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

请求实现:从单列拆分姓名与薪资并按姓名汇总薪资

解决方案:拆分姓名与薪资并按姓名汇总求和

没问题,这是个很常见的字符串拆分+聚合统计需求,先明确你的需求:

输入:col_details列包含值Sam100、Ram200、Sam1000、Ram50000、Aryan450
期望输出:生成含col_name和col_salary的结果集,其中Sam对应1100、Ram对应50200、Aryan对应450。

下面是几种主流数据库的实现方案:

MySQL 实现

利用正则表达式函数拆分字符串,再分组求和:

SELECT
  REGEXP_SUBSTR(col_details, '[A-Za-z]+') AS col_name,
  SUM(CAST(REGEXP_REPLACE(col_details, '[A-Za-z]+', '') AS UNSIGNED)) AS col_salary
FROM your_table
GROUP BY col_name
ORDER BY col_name;
  • REGEXP_SUBSTR(col_details, '[A-Za-z]+'):提取col_details中的所有英文字母作为姓名
  • REGEXP_REPLACE(col_details, '[A-Za-z]+', ''):移除所有字母,得到薪资数字字符串,转成无符号整数后求和
  • 最后按姓名分组,得到每个用户的总薪资

SQL Server 实现

通过PATINDEX定位数字起始位置来拆分:

SELECT
  LEFT(col_details, PATINDEX('%[0-9]%', col_details) - 1) AS col_name,
  SUM(CAST(SUBSTRING(col_details, PATINDEX('%[0-9]%', col_details), LEN(col_details)) AS INT)) AS col_salary
FROM your_table
GROUP BY LEFT(col_details, PATINDEX('%[0-9]%', col_details) - 1)
ORDER BY col_name;
  • PATINDEX('%[0-9]%', col_details):找到字符串中第一个数字的位置
  • LEFT(...):截取数字之前的所有字符作为姓名
  • SUBSTRING(...):截取从第一个数字到末尾的字符作为薪资,转成整数后求和

PostgreSQL 实现

PostgreSQL原生支持正则匹配的字符串截取:

SELECT
  SUBSTRING(col_details FROM '[A-Za-z]+') AS col_name,
  SUM(SUBSTRING(col_details FROM '[0-9]+')::INT) AS col_salary
FROM your_table
GROUP BY col_name
ORDER BY col_name;
  • SUBSTRING(col_details FROM '[A-Za-z]+'):直接提取字母部分作为姓名
  • SUBSTRING(col_details FROM '[0-9]+')::INT:提取数字部分并转成整数,求和后按姓名分组

注意事项

  • 确保col_details的格式是纯字母+纯数字的组合,如果存在特殊字符(如下划线、空格),需要调整正则表达式(比如MySQL用[[:alpha:]]匹配所有字母类字符)
  • 如果薪资包含小数,将INT/UNSIGNED替换为DECIMAL(10,2)或FLOAT类型
  • 如果姓名包含非英文字母(如带重音的字符),要对应调整正则的匹配范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:45