SQL未按主键分组使用SUM函数:如何将多行求和结果合并为单行
解决方法
你遇到的问题是因为去掉GROUP BY后,HAVING子句里的字段既没被聚合也没在分组定义中,数据库无法解析。要实现所有符合条件的holdings求和并返回单条结果,只需要把HAVING里的行级过滤条件移到WHERE子句中,同时去掉GROUP BY即可:
SELECT SUM(mh.holdings) AS total_holdings FROM market_data.mstar_holdings mh INNER JOIN market_data.holder_type ht ON ht.holder_type_code = mh.mstar_security_specific_holder_type WHERE mstar_investment_id = 'E0USA00AY9' AND ht.adjustment_flag = true AND ht.is_consolidated = false AND mh.ownership_percentage > ht.adjustment_threshold;
原理说明
- 原来的
HAVING是用来过滤分组后的结果,但ownership_percentage > ht.adjustment_threshold是行级判断条件(每一行都要满足这个规则),所以应该放到WHERE里先筛选出符合条件的行,再对这些行的holdings求和。 - 去掉
GROUP BY后,整个查询会把所有符合条件的行作为一个整体聚合,最终返回一个单一的总和值。
如果你的数据库对字段引用有严格的模式限制,也可以用子查询先过滤出符合条件的记录,再在外层求和:
SELECT SUM(holdings) AS total_holdings FROM ( SELECT mh.holdings FROM market_data.mstar_holdings mh INNER JOIN market_data.holder_type ht ON ht.holder_type_code = mh.mstar_security_specific_holder_type WHERE mstar_investment_id = 'E0USA00AY9' AND ht.adjustment_flag = true AND ht.is_consolidated = false AND mh.ownership_percentage > ht.adjustment_threshold ) AS filtered_rows;
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

