0

这可能比我想象的要容易,但我很难过。我写了下面的查询,它总结了客户在特定商店的所有购买,以及同一客户在同一商店的退货总额,最后,存储从总退货中减去总退货的结果在名为 TOTAL_SPENT 的计算列中购买。这是我的查询:

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_SPENT >= 500.00 的返回数据。但是对于我的生活,我无法弄清楚如何做到这一点!羞愧地低着头

4

1 回答 1

1

在 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

注意:如果您要查找500 以上的,请使用该子句而不是.TOTAL_SPENTHAVINGWHERE

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 * 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;
于 2013-07-30T17:58:40.110 回答