2017-06-26 81 views
1
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 

我想記錄數量,其總和大於零,但出現以下錯誤聚合不應出現在WHERE子句中,除非它在

聚合不應出現在WHERE子句中除非它位於包含在HAVING子句或選擇列表中的 子查詢中,並且聚合的列 是外部引用。

+0

既然你引述錯誤信息,請解釋它是什麼你不明白,因爲到目前爲止,我們所能做的就是告訴你,聚合可能不會出現在WHERE子句中,除非它在子查詢中在HAVING子句或選擇列表中撿起,並且被聚合的列是外部引用。 –

+1

將'where'改爲'having',並在子查詢上用'group by salemrp'作爲前綴。 – xQbert

+0

如何獲得單個記錄的「數量總和」?你的意思是'哪裏stkqty> 0'? –

回答

3

當聚集篩選你應該使用having而不是where

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 

而且這可能是更高性能的書面無論是作爲連接或使用EXISTS

-- 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 
+1

從邏輯上看,它似乎也是需要的......但也許不是。並同意,存在可能會更快。 – xQbert

+0

不工作... stkqty字段與sap_stockmaster處於同一個表中。 – Shail

+0

@Shail - ...這就是爲什麼在使用'EXISTS'的第二個示例中存在表別名的原因。 – Igor

相關問題