如何用SUM()与GROUP BY对同类型子类数据分组求和?
问题分析
原SQL存在两个核心问题:
- 求和字段错误:你需要对数值型的
col2求和,但原语句写了sum(col1)——col1是字符串类型,这个求和逻辑完全错误。 - 分组维度错误:原语句按完整的
col1值分组,会得到4条独立结果,而你需要按col1中的品类(milk/coffee)分组。
解决方案
核心思路是先从col1中提取出品类名称,再按品类分组对col2求和。不同数据库的字符串提取函数略有差异,以下是主流数据库的实现方式:
MySQL/MariaDB
用SUBSTRING_INDEX提取-分隔后的后缀:
SELECT SUBSTRING_INDEX(col1, '-', -1) AS category, SUM(col2) AS total FROM your_table GROUP BY SUBSTRING_INDEX(col1, '-', -1);
SQL Server
通过CHARINDEX定位-的位置,再用RIGHT截取后缀:
SELECT RIGHT(col1, LEN(col1) - CHARINDEX('-', col1)) AS category, SUM(col2) AS total FROM your_table GROUP BY RIGHT(col1, LEN(col1) - CHARINDEX('-', col1));
Oracle
用INSTR找到-的位置,结合SUBSTR提取后缀:
SELECT SUBSTR(col1, INSTR(col1, '-') + 1) AS category, SUM(col2) AS total FROM your_table GROUP BY SUBSTR(col1, INSTR(col1, '-') + 1);
PostgreSQL(正则方式)
支持正则表达式直接替换掉前缀:
SELECT REGEXP_REPLACE(col1, '.*-', '') AS category, SUM(col2) AS total FROM your_table GROUP BY REGEXP_REPLACE(col1, '.*-', '');
预期结果
执行上述语句后,会得到符合需求的结果:
| category | total |
|---|---|
| milk | 300 |
| coffee | 30 |
内容的提问来源于stack exchange,提问作者Miloudz
相关产品推荐
相关产品推荐

