SQL查询:同组TAS_FNAME以/分隔合并并按指定格式显示
合并同组TAS_FNAME并保留原始行格式
当前查询结果(表1)
| Requisition_number | per_id | per_name | Job_title | Interview | TAS_EMAIL_ADDRESS | TAS_FNAME |
|---|---|---|---|---|---|---|
| 22021 | 1097 | Chad | Manager | This is a comment | abc.g@gmail.COM | abc |
| 22021 | 1097 | Chad | Manager | This is a comment | xyz.g@gmail.COM | xyz |
期望输出格式
| Requisition_number | per_id | per_name | Job_title | Interview | TAS_EMAIL_ADDRESS | TAS_FNAME |
|---|---|---|---|---|---|---|
| 22021 | 1097 | Chad | Manager | This is a comment | abc.g@gmail.COM | abc/xyz |
| 22021 | 1097 | Chad | Manager | This is a comment | xyz.g@gmail.COM |
需求说明
当Requisition_number和per_id相同,且除TAS_EMAIL_ADDRESS外其他列均一致时,将该组所有TAS_FNAME以/分隔拼接,仅在组内第一行显示拼接结果,其余行TAS_FNAME留空。
尝试过的方法及问题
- 使用
xmlagg表达式:
rtrim (xmlagg (xmlelement(e,tas_fname||'/')).extract ('//text()'), '/') AS tas_fname
结果未生效,输出仍与表1一致——原因是未对分组字段做聚合处理,直接使用无法合并同组数据。
- 使用
listagg函数搭配within group (order by)时出现语法错误,大概率是语法格式不正确(比如未指定分组字段、order by子句格式错误)。
解决方案
可以通过窗口函数先计算同组的拼接结果,再用行号控制仅第一行显示拼接值,其余行留空。以下是不同数据库的适配示例:
Oracle数据库适配SQL
SELECT Requisition_number, per_id, per_name, Job_title, Interview, TAS_EMAIL_ADDRESS, CASE WHEN row_number() OVER (PARTITION BY Requisition_number, per_id, per_name, Job_title, Interview ORDER BY TAS_EMAIL_ADDRESS) = 1 THEN listagg(TAS_FNAME, '/') WITHIN GROUP (ORDER BY TAS_FNAME) OVER (PARTITION BY Requisition_number, per_id, per_name, Job_title, Interview) ELSE '' END AS TAS_FNAME FROM 你的表名;
PostgreSQL数据库适配SQL
SELECT Requisition_number, per_id, per_name, Job_title, Interview, TAS_EMAIL_ADDRESS, CASE WHEN row_number() OVER (PARTITION BY Requisition_number, per_id, per_name, Job_title, Interview ORDER BY TAS_EMAIL_ADDRESS) = 1 THEN string_agg(TAS_FNAME, '/' ORDER BY TAS_FNAME) OVER (PARTITION BY Requisition_number, per_id, per_name, Job_title, Interview) ELSE '' END AS TAS_FNAME FROM 你的表名;
代码说明
PARTITION BY子句:按照需求中的分组条件划分组,确保只有指定字段完全相同的行才会被归为一组。- 聚合函数(
listagg/string_agg):以窗口函数形式计算每组内所有TAS_FNAME的拼接结果。 row_number()函数:标记组内的第一行,仅在该行显示拼接后的结果,其余行通过ELSE ''设置为空。
内容的提问来源于stack exchange,提问作者SSA_Tech124
相关产品推荐
相关产品推荐

