带Sum求和与分组功能的Select查询及item列合并实现求助

分组求和+合并item列实现方案
不同数据库对应的字符串聚合语法略有差异,通用实现逻辑为「GROUP BY指定分组维度 + 数值字段用SUM()求和 + 文本item字段用对应数据库的字符串聚合函数合并」,各主流数据库示例如下:
MySQL
使用GROUP_CONCAT函数实现字段合并,示例代码:SELECT 分组列名, GROUP_CONCAT(item SEPARATOR ',') AS merged_items, SUM(需要求和的数值列名) AS total_value FROM 你的表名 GROUP BY 分组列名;若需要合并的item去重,可改写为
GROUP_CONCAT(DISTINCT item SEPARATOR ','),分隔符可自行替换为空格、斜杠等其他符号。PostgreSQL
使用STRING_AGG函数实现字段合并,示例代码:SELECT 分组列名, STRING_AGG(item, ',' ORDER BY item) AS merged_items, SUM(需要求和的数值列名) AS total_value FROM 你的表名 GROUP BY 分组列名;SQL Server
2017及以上版本使用STRING_AGG函数,示例代码:SELECT 分组列名, STRING_AGG(item, ',') WITHIN GROUP (ORDER BY item) AS merged_items, SUM(需要求和的数值列名) AS total_value FROM 你的表名 GROUP BY 分组列名;2016及更低版本可通过
FOR XML PATH语法实现,示例:SELECT 分组列名, STUFF((SELECT ',' + item FROM 你的表名 t2 WHERE t2.分组列名 = t1.分组列名 FOR XML PATH('')),1,1,'') AS merged_items, SUM(需要求和的数值列名) AS total_value FROM 你的表名 t1 GROUP BY 分组列名;Oracle
11gR2及以上版本使用LISTAGG函数,示例代码:SELECT 分组列名, LISTAGG(item, ',') WITHIN GROUP (ORDER BY item) AS merged_items, SUM(需要求和的数值列名) AS total_value FROM 你的表名 GROUP BY 分组列名;若合并后字符串长度超过varchar上限,可改用
XMLAGG函数处理。
注意:GROUP BY后指定的列,需要覆盖SELECT子句中所有未使用聚合函数的字段,否则会触发语法错误。
内容的提问来源于stack exchange,提问作者Mumhammad Mumtaz Ali
相关产品推荐
相关产品推荐

