Sql server 除非在WHERE条款中,否则骨料不得出现在WHERE条款中

Sql server 除非在WHERE条款中,否则骨料不得出现在WHERE条款中,sql-server,Sql Server,我想要数量之和大于零的记录,但得到以下错误 除非是在一个集合中,否则集合不能出现在WHERE子句中 HAVING子句或select列表中包含的子查询,以及列 聚合是一个外部引用 在对聚合进行筛选时,应使用having而不是where select * from sap_stockmaster where itemid=9893 and salemrp=1034.00 and salemrp in( select salemrp from sa

我想要数量之和大于零的记录,但得到以下错误

除非是在一个集合中,否则集合不能出现在WHERE子句中 HAVING子句或select列表中包含的子查询,以及列 聚合是一个外部引用


在对聚合进行筛选时,应使用
having
而不是
where

select 
    * 
from sap_stockmaster 
where itemid=9893 
and salemrp=1034.00 
and salemrp in(
    select 
        salemrp 
    from sap_stockmaster 
    where SUM(stkqty)>0
) 
order by salemrp desc
此外,当连接或使用存在时,这可能更有效

select * 
from sap_stockmaster 
where itemid=9893 
and salemrp=1034.00 
and salemrp in (select salemrp 
    from sap_stockmaster 
    group by salemrp
    HAVING SUM(stkqty)>0) 
order by salemrp desc

由于您逐字引用了错误消息,请解释您不理解的部分,因为到目前为止,我们所能做的只是告诉您,聚合可能不会出现在WHERE子句中,除非它出现在HAVING子句或select列表中包含的子查询中,正在聚合的列是外部引用。将
where
更改为
having
,并在子查询上以
group by salemrp
开头。如何获得单个记录的“数量总和”?您的意思是
其中stkqty>0
?只选择您想要的列,按未聚合的列分组,并将
总和(stkqty)>0
放在
Having
子句中。从逻辑上讲,似乎也需要一个分组依据。。。但也许不是。并且同意,存在可能会更快。不工作。。。stkqty字段在同一个表中,即在sap_stockmaster中。@Shail-。。。这就是为什么在第二个示例中有使用
EXISTS
的表别名。我似乎总是使用JOIN而不是in。我不知道哪一个更快加入或存在。@Shail-提供一个(阅读链接)。您必须提供DDL、样本数据和预期输出。我在回答中提出的问题是正确的。它们不起作用的原因可能是用户的错误,也就是说,您拥有的数据值并没有被考虑在内。这些是什么是任何人猜测,因为我们没有你的数据在我们面前。没有电脑,任何人都无法访问你的电脑。
-- example with Exists

SELECT * 
FROM sap_stockmaster ss1
WHERE itemid=9893 
AND salemrp=1034.00 
AND EXISTS (SELECT 1 
    FROM sap_stockmaster ss2
    WHERE ss1.salemrp = ss2.salemrp
    GROUP BY ss2.salemrp
    HAVING SUM(ss2.stkqty)>0)
ORDER BY salemrp DESC