如何在此 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 而不是重复表达式以使查询更容易理解。
我有两个 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 而不是重复表达式以使查询更容易理解。