请看下面的查询
SELECT
product_id, SUM(unit_price * quantity) Total
FROM
tblOrders
GROUP BY
product_id
HAVING
SUM(unit_price * quantity) > 1000
上面的查询工作正常。但您可以在查询中看到,
Total
是计算列,并且在HAVING
子句中再次使用相同的计算。
如何避免在
HAVING
子句中使用相同的计算?
好吧,在过去几天对这个主题进行了更多研究之后,我找到了答案。事实上,我在问题中发布的查询是完全正确的,只是我们可以用其他方式编写该查询,但我们实际上无法避免重用计算,即使我们像这样进行查询
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的子句引用。您可以获取更多信息这里
这里还有另一种方法是使用
Subquery
代替使用 HAVING
子句来避免进一步计算:
SELECT *
FROM
(
SELECT product_id,
SUM(unit_price * quantity) Total
FROM tblOrders
GROUP BY product_id
) A
WHERE A.Total > 1000;
您需要一个聚合函数。我猜你真的想要:
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
键。
你可以在这里使用子查询。
正确的查询是
选择 Product_id, SUM(单价 * 数量) 总计 从 订单表 通过...分组 产品编号 拥有 从 tblorders > 1000 中选择 SUM(单价 * 数量);