在 SQL 中,WHERE 子句在SELECT 子句之前处理。因此,当 SQL 开始过滤表中与查询相关的行时,它还不知道列 TOTAL_SPENT。
有几种方法可以解决这个问题。
1) 在WHERE 子句中重复表达式,而不是在SELECT 子句中引用列名:
SELECT Account_Id,
SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED,
SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED,
(TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT
FROM Transactions_Table
WHERE Store = 'Store XYZ'
GROUP BY Account_Id
ORDER BY
(SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) - SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END)) DESC
注意:如果您要查找 TOTAL_SPENT 高于 500 的 组,请使用 HAVING 子句而不是 WHERE。
2) 使用视图。删除您的 WHERE 子句并使用您的查询创建一个 VIEW。然后,从该视图中选择并添加您的WHERE 子句。
CREATE VIEW Whatever AS
SELECT Account_Id,
SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED,
SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED,
(TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT
FROM Transactions_Table
GROUP BY Account_Id;
SELECT * From Whatever WHERE TOTAL_SPENT >= 500
3) 使用嵌套的 SELECT:
select * from (
SELECT
Account_Id,
SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED,
SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED,
(TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT
FROM Transactions_Table
WHERE Store = 'Store XYZ'
GROUP BY Account_Id
) where TOTAL_SPENT > 500 ORDER BY TOTAL_SPENT DESC;
4) 如果您的数据库支持,请使用 CTE:
WITH MyQuery AS (
SELECT
Account_Id,
SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED,
SUM(CASE WHEN Transaction_Code = 'Return' THEN Transaction_Amount ELSE 0 END) AS TOTAL_RETURNED,
(TOTAL_PURCHASED - TOTAL_RETURNED) AS TOTAL_SPENT
FROM Transactions_Table
WHERE Store = 'Store XYZ'
GROUP BY Account_Id
)
SELECT * FROM MyQuery WHERE TOTAL_SPENT > 500 ORDER BY TOTAL_SPENT DESC;