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
相关产品推荐
相关产品推荐

