22

删除不想聚合的值非常容易。

例如:

SELECT department, SUM(sales) as "Total sales"
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000;

这将从总和聚合中排除所有价值小于或等于 1000 的销售额。

但是聚合后如何过滤呢?

例如WHERE ("Total sales"> 15000)

编辑:具有讽刺意味的是,我只是HAVING SUM(sales) > 1000;为了防止混淆所需的查询类型;因为我实际上对从求和中排除项目并不感兴趣,只是返回的结果!谢谢,尽管很困惑!

4

3 回答 3

26

您的查询实际上是在做您想做的事情,而不是您在问题中表达的内容。如果要排除所有小于 1000 的销售额,则应使用WHERE sales > 1000. 但是HAVING SUM(sales) > 1000过滤实际上是在聚合之后完成的。

编写子查询并SELECT WHERE在原始查询之上添加另一个查询是多余的。

请参阅小提琴以进行澄清。

#Query1

SELECT department, SUM(sales) as Total
FROM order_details
GROUP BY department
HAVING Total > 40;

#Query 2

SELECT department, SUM(sales) as Total
FROM order_details
GROUP BY department
HAVING  SUM(sales) > 40;

#Query 3

SELECT department, SUM(sales) as Total
FROM order_details
WHERE sales > 40
GROUP BY department;

#Query 1 and 2 are the same, filtering after aggregation
#Query 3 is filtering before aggregation
于 2013-04-02T15:24:20.033 回答
4

如果要过滤价值小于 1000 的销售,正确的查询是

SELECT department, sales
FROM order_details
WHERE sales > 1000

如果你想聚合,并且只保留总和超过 15000,那么你需要这个查询:

SELECT department, SUM(sales) as TotalSales
FROM order_details
WHERE sales > 1000
GROUP BY department
HAVING SUM(sales) > 15000
于 2013-04-02T15:22:24.623 回答
0

您可以通过将总和选择到临时表中,然后从临时表中进行选择来分两步进行:

SELECT department, SUM(sales) as TotalSales
INTO #temp
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000

SELECT department, TotalSales
FROM #temp
WHERE TotalSales > 15000

DROP TABLE #temp
于 2013-04-02T15:19:46.410 回答