如何在SQL中过滤经过数学计算的数据?

如何在SQL中过滤经过数学计算的数据?,sql,logic,arithmetic-expressions,Sql,Logic,Arithmetic Expressions,这可能比我想象的要容易,但我被难倒了。我编写了以下查询,该查询汇总了某个客户在某个特定商店所做的所有购买,以及同一客户在同一商店所做的退货总额,最后,将从总购买量中减去总退货的结果存储在一个名为total_Exponed的计算列中。我的问题是: SELECT Account_Id, SUM(CASE WHEN Transaction_Code = 'Purchase' THEN Transaction_Amount ELSE 0 END) AS TOTAL_PURCHASED, SUM(

这可能比我想象的要容易,但我被难倒了。我编写了以下查询,该查询汇总了某个客户在某个特定商店所做的所有购买,以及同一客户在同一商店所做的退货总额,最后,将从总购买量中减去总退货的结果存储在一个名为total_Exponed的计算列中。我的问题是:

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 TOTAL_SPENT DESC

我的问题是,这个查询返回数十万条记录,但我只关心大约10%的返回数据。所以,假设您只希望看到返回的数据,其中TOTAL_Consumed>=500.00。但就我个人而言,我不知道该怎么做!在SQL中,
WHERE
子句在
SELECT
子句之前处理。因此,当SQL开始从表中筛选与查询相关的行时,它还不知道列
TOTAL\u-spend

有几种方法可以解决这个问题

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
注意:如果您要查找花费总额超过500的组,请使用
HAVING
子句而不是
WHERE

2)使用视图。删除
WHERE
子句,并使用查询创建一个
视图。然后,从该视图中选择并添加
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 * 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;

谢谢你,先生!正如您所建议的,我尝试创建一个视图,但不幸的是,我没有获得足够高的访问级别来创建视图。我尝试了嵌套的select next,它给出了我想要的确切结果。