请查看以下查询
SELECT
product_id, SUM(unit_price * quantity) Total
FROM
tblOrders
GROUP BY
product_id
HAVING
SUM(unit_price * quantity) > 1000
以上查询工作正常。但是你可以在那里看到查询,Total
是一个计算列,并且在HAVING
子句中再次使用相同的计算。
如何避免在HAVING
子句中使用相同的计算?
答案 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
密钥。