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

Cognos SQL实现股票代码对应多行记录转单行的技术求助

我懂你现在的需求——把同一个stock_code对应的多条笔记记录合并成一行,直接在查询里完成对吧?之前试了各种SQL方法却收到“无法识别的查询框架”的报错,大概率是用了和你当前数据库不兼容的函数,毕竟不同数据库的字符串聚合语法差异还挺大的。我给你整理了几种主流数据库的解决方案,你对应自己的数据库来用就行:

不同数据库的实现方案

MySQL/MariaDB

用GROUP_CONCAT函数,这是MySQL系最常用的字符串聚合工具,还能指定合并顺序和分隔符:

SELECT 
    stock_code,
    GROUP_CONCAT(stock_note ORDER BY note_sequence SEPARATOR ' ') AS combined_notes
FROM note
GROUP BY stock_code;
  • ORDER BY note_sequence是为了保证合并后的笔记顺序和原记录的序号一致,避免乱序
  • SEPARATOR可以换成你需要的符号,比如换行符'\n'、分号';'都可以

PostgreSQL

PostgreSQL用STRING_AGG函数,用法更直观:

SELECT 
    stock_code,
    STRING_AGG(stock_note, ' ' ORDER BY note_sequence) AS combined_notes
FROM note
GROUP BY stock_code;

同样支持自定义分隔符和排序,直接把分隔符写在第二个参数位置就行。

SQL Server

分版本来看:

2017及以上版本(推荐)

直接用STRING_AGG,还能通过WITHIN GROUP指定排序:

SELECT 
    stock_code,
    STRING_AGG(stock_note, ' ') WITHIN GROUP (ORDER BY note_sequence) AS combined_notes
FROM note
GROUP BY stock_code;

2016及以下老版本

只能用FOR XML PATH的拼接方式,稍微麻烦点:

SELECT 
    DISTINCT stock_code,
    STUFF((
        SELECT ' ' + stock_note
        FROM note n2
        WHERE n2.stock_code = n1.stock_code
        ORDER BY n2.note_sequence
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS combined_notes
FROM note n1;

这里STUFF的作用是去掉拼接后开头多余的那个空格。

Oracle

用LISTAGG函数处理常规长度的字符串:

SELECT 
    stock_code,
    LISTAGG(stock_note, ' ') WITHIN GROUP (ORDER BY note_sequence) AS combined_notes
FROM note
GROUP BY stock_code;

如果合并后的内容太长超过了VARCHAR2的限制,就用XMLAGG来生成大文本:

SELECT 
    stock_code,
    RTRIM(XMLAGG(XMLELEMENT(e, stock_note || ' ', '') ORDER BY note_sequence).EXTRACT('//text()').GETCLOBVAL(), ' ') AS combined_notes
FROM note
GROUP BY stock_code;

你可以先确认自己用的是哪种数据库,然后对应上面的SQL来测试,应该就能解决之前的报错问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:57:52