如何在此 SQL 查询中使用 WHERE 子句?

How can I use WHERE clause in this SQL query?

我有两个 tables - 客户和订单。客户只包含一个 ID 和名称。订单包含订单 ID、客户 ID 和订单金额。我的目标是对每个客户的订单求和,即使是没有任何订单的客户(因此,结果集中为 0)。

问题 实际上,我只需要显示每个客户 ID 的总数 < 500 的条目。我有一个 WHERE 子句,但出现错误。

SELECT * FROM orders;
SELECT * FROM customer;

SELECT
    c.customer_id, c.customer_name, ISNULL(sum(o.order_total),0) as grand_total
FROM
    customer c
LEFT JOIN
    orders o
ON
    c.customer_id = o.customer_id
--WHERE
    --grand_total < 500
GROUP BY
    c.customer_id, c.customer_name
ORDER BY
    grand_total

我能够通过 LEFT JOIN 做到这一点,并让客户 table 在“左边”,以获得每个客户,并在他们没有订单时显示 0。我将每个订单(按客户)的总和别名为 grand_total。 当我在 grand_total 和 ORDER_BY 中使用时,别名被识别,并且 grand_total 列按预期排序。但是当我在我的 WHERE 语句中引用 grand_total 别名时(即 WHERE grand_total < 500),我得到错误 无效列名 'grand_total'

我很困惑为什么 grand_total 在 ORDER_BY 而不是 WHERE 中被识别。除此之外,我正在尝试为 WHERE 子句找到正确的语法以仅包含 grand_total < 500.

的行

使用 HAVING 过滤组,而不是 WHERE:

SELECT
    c.customer_id,
    c.customer_name,
    COALESCE(sum(o.order_total), 0) as grand_total
FROM customer c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY 1, 2
HAVING COALESCE(sum(o.order_total), 0) < 500
ORDER BY 3

由于您没有指定您使用的是哪个数据库,我将 ISNULL 更改为 COALESCE 并使用了 HAVING 中的实际表达式,这使得它完全可移植。

还在 GROUP BY 和 ORDER BY 中使用列 numbers 而不是重复表达式以使查询更容易理解。