在 HAVING 子句中重用计算列

问题描述 投票:0回答:4

请看下面的查询

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

上面的查询工作正常。但您可以在查询中看到,

Total
是计算列,并且在
HAVING
子句中再次使用相同的计算。

如何避免在

HAVING
子句中使用相同的计算?

sql sql-server t-sql
4个回答
8
投票

好吧,在过去几天对这个主题进行了更多研究之后,我找到了答案。事实上,我在问题中发布的查询是完全正确的,只是我们可以用其他方式编写该查询,但我们实际上无法避免重用计算,即使我们像这样进行查询

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
语句的顺序,
SELECT
语句中定义的任何列别名或派生列都不能被前面顺序小于8的子句引用。您可以获取更多信息这里


2
投票

这里还有另一种方法是使用

Subquery
代替使用
HAVING
子句来避免进一步计算:

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

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
键。


0
投票

你可以在这里使用子查询。

正确的查询是

选择 Product_id, SUM(单价 * 数量) 总计 从 订单表 通过...分组 产品编号 拥有 从 tblorders > 1000 中选择 SUM(单价 * 数量);

© www.soinside.com 2019 - 2024. All rights reserved.