如何在HAVING子句中重用计算列?

时间:2017-10-26 21:17:36

标签: sql sql-server tsql

请查看以下查询

SELECT 
    product_id, SUM(unit_price * quantity) Total
FROM 
    tblOrders
GROUP BY 
    product_id
HAVING
    SUM(unit_price * quantity) > 1000

以上查询工作正常。但是你可以在那里看到查询,Total是一个计算列,并且在HAVING子句中再次使用相同的计算。

如何避免在HAVING子句中使用相同的计算?

3 个答案:

答案 0 :(得分:1)

另一种方法是避免使用Subquery进一步计算,而不是使用HAVING条款:

SELECT *
FROM
(
    SELECT product_id,
           SUM(unit_price * quantity) Total
    FROM tblOrders
    GROUP BY product_id
) A
WHERE A.Total > 1000;

答案 1 :(得分:1)

好吧,经过最近几天在这个问题上做了一些研究,我找到了答案。事实上,我在问题中发布的查询是完全正确的,只是我们可以用其他方式编写该查询,但我们无法实际重用计算,即使我们进行查询{{ 1}}如下所示:

nested

这只是因为SELECT * FROM ( SELECT product_id, SUM(unit_price * quantity) Total FROM tblOrders GROUP BY product_id ) A WHERE A.Total > 1000; 语句的逻辑处理顺序。请看下面的顺序:

SELECT

请注意1. FROM 2. ON 3. JOIN 4. WHERE 5. GROUP BY 6. WITH CUBE or WITH ROLLUP 7. HAVING 8. SELECT 9. DISTINCT 10. ORDER BY 11. TOP 语句的顺序,SELECT语句中定义的任何列别名或派生列都不能被前面的小于8的子句引用。您可以获得有关它的更多信息{{ 3}}

答案 2 :(得分:0)

您需要一个聚合功能。我猜你真的想要:

select product_id, sum(unit_price * quantity) as Total
from tblOrders
group by product_id
having sum(unit_price * quantity) > 1000;

您的原始查询在语法上是不正确的,应该在SQL Server上返回编译器错误 - 因为unit_price * quantity不是group by密钥。