MS SQL:如何筛选聚合SUM(VALUE)结果大于1的记录
解决SQL聚合结果过滤的问题
嘿,我来帮你搞定这个SQL的问题!先给你梳理下原语句里的几个小问题,再给出修正后的方案:
首先,原SQL里有两处小错误需要先修正:
- 表名拼写笔误:
tabelex和tabeley应该是你实际使用的表名(比如改成tablex和tabley) - 模糊查询语法错误:
like = ENG写法不对,应该是like 'ENG';如果要匹配包含ENG的字符串,就用like '%ENG%'
接下来,核心需求是只显示SUM(VALUE)大于1的记录,这里要注意:聚合函数的过滤不能用WHERE子句(WHERE是过滤行级原始数据的),必须用HAVING子句来过滤分组后的聚合结果。
修正后的完整SQL语句
SELECT x.name, SUM(x.value) AS total_value FROM tablex x JOIN tabley y ON x.id = y.id WHERE y.location LIKE 'ENG' -- 根据实际需求调整匹配规则,比如'%ENG%' GROUP BY x.name -- 必须按name分组,才能计算每个stock的总和 HAVING SUM(x.value) > 1;
关键逻辑说明
GROUP BY x.name:因为你需要按每个stock的name分组,单独计算每个stock的VALUE总和,没有分组的话聚合函数会把所有行当成一组,不符合你的需求。HAVING SUM(x.value) > 1:这一步专门用来筛选分组后总和大于1的记录,只有聚合后的结果才能用HAVING来过滤,这是和WHERE的核心区别。
结合你的测试数据,假设关联后每个stock的总和是:
- stock1: (-1)+5+(-2)=2 → 符合条件
- stock2:10+(-2)+(-1)=7 → 符合条件
- stock3:15 → 符合条件
- stock4:16+(-5)+(-6)=5 → 符合条件
执行上面的SQL后,这四个stock都会被返回(前提是它们都满足y.location LIKE 'ENG'的条件)。
内容的提问来源于stack exchange,提问作者Artur Stolc
相关产品推荐
相关产品推荐

