2017-06-12 77 views
1

有关我的问题的简单示例,为什么我不能这样做?为什么我们不能在分组声明中使用Where子句?

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

(在这种情况下,任何引起混乱,为什么我不能只返回有超过1000的结果收入?)

声明,我有点新的SQL,但找不到任何关于这个的文件。

谢谢,

+0

当条件属于聚合数据时,您需要使用'having'而不是'where'(在group by之后)。 – trincot

+0

您可以使用'where revenue> 1000'来过滤聚合之前的单个行。 –

+0

这是不行的,因为他想要所有他的产品的总和。因此,如果他有五种产品,每种价值999美元,那么他的总价格就会变成0美元,因为它们都没有超过1000美元。 – SandPiper

回答

1

这是设计的SQL。通过使用WHERE您筛选源表。声明片段的顺序如同书面。这意味着你想过滤在过滤表上应用的SUM。这意味着您必须使用HAVING子句对已分组结果使用过滤器。使用

select id_number, sum(revenue) 
from table A  
group by id_number 
having sum(revenue) > 1000 
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 
相关问题