SQL中如何实现聚合列与普通列的比较?
解决聚合列与普通列的比较问题
你的问题核心是HAVING子句中引用非聚合普通列时的合法性问题,不同SQL方言对该场景的支持存在差异(比如MySQL关闭ONLY_FULL_GROUP_BY模式时允许,但严格模式下会报错),以下是几种靠谱的解决办法:
方法1:将普通列加入GROUP BY子句
由于table1.id是分组依据,且table1.total1应为每个id对应的唯一值,将其加入GROUP BY不会改变分组逻辑,同时能让HAVING合法引用该列:
select table1.id, (table1.total1 - sum(table2.total2*table2.quantity)) as finalTotal from table1 join table2 on table1.id=table2.fid group by table1.id, table1.total1 having table1.total1 > sum(table2.total2*table2.quantity)
方法2:用聚合函数包裹普通列
每个分组内的table1.total1值完全相同,用MAX()或MIN()包裹后,本质仍取该列的唯一值,可满足HAVING子句的语法要求:
select table1.id, (table1.total1 - sum(table2.total2*table2.quantity)) as finalTotal from table1 join table2 on table1.id=table2.fid group by table1.id having MAX(table1.total1) > sum(table2.total2*table2.quantity)
方法3:用子查询预计算聚合值
先通过子查询算出每个fid对应的聚合结果,再与table1关联做比较,逻辑更清晰,也规避了分组时的列引用限制:
select t1.id, (t1.total1 - t2.sum_total) as finalTotal from table1 t1 join ( select fid, sum(total2*quantity) as sum_total from table2 group by fid ) t2 on t1.id = t2.fid where t1.total1 > t2.sum_total
注:建议使用显式JOIN语法代替旧的逗号分隔表写法,提升代码可读性。
内容的提问来源于stack exchange,提问作者Spooky
相关产品推荐
相关产品推荐

