为什么我们不能在Grouped声明中使用Where子句?

时间:2017-06-12 19:58:19

标签: sql oracle

关于我的问题的简化示例,为什么我不能这样做?

select id_number, sum(revenue)
from table A
where sum(revenue)>1000
group by id_number

(如果这引起任何混淆,为什么我不仅可以返回收入超过1000的结果?)

免责声明,我对SQL有点新,但找不到任何关于此的文档。

谢谢,

2 个答案:

答案 0 :(得分:1)

这是SQL的设计。通过使用WHERE您过滤源表。语句片段的顺序如同编写。这意味着您希望过滤应用于过滤表的SUM。这意味着您必须使用HAVING子句对已经分组的结果使用过滤器。使用

 select id_number, sum(revenue)
 from table A     
 group by id_number
 having sum(revenue) > 1000

答案 1 :(得分:0)

简单回答是因为在聚合子句之前评估了WHERE子句。因此,您尝试根据尚不存在的内容进行过滤。但是,您可以通过首先存在来解决该问题。编写子查询,然后从中选择:

WITH RevenueTotals AS (SELECT id_number, sum(revenue) AS Rev_Total 
                       FROM table A 
                       GROUP BY id_number)
SELECT id_number, Rev_Total
FROM RevenueTotals
WHERE Rev_Total > 1000