SQL:需要在满足HAVING语句的结果上使用SUM

时间:2010-03-30 18:45:28

标签: sql mysql

我有一个表格,我们记录每个用户的值,如money_spent,money_spent_on_candy和日期。

所以这个表中的列(我们称之为MoneyTable)将是:

  • 用户ID
  • Money_Spent
  • Money_Spent_On_Candy
  • 日期

我的目标是减少money_spent的总金额 - 但仅适用于他们花费超过糖果日期范围总花费的10%的用户。

那个查询是什么?

我知道如何选择拥有此功能的用户 - 然后我可以输出数据并手动求和,但我想在一个查询中执行此操作。

以下是仅为已花费>的用户提取每用户支出总和的查询他们10%的钱花在糖果上。

SELECT 
    UserId, 
    SUM(Money_Spent), 
    SUM(Money_Spent_On_Candy) / SUM(Money_Spent) AS PercentCandySpend 
FROM MoneyTable 
WHERE DATE >= '2010-01-01'
HAVING PercentCandySpend > 0.1;

3 个答案:

答案 0 :(得分:3)

单个查询无法执行此操作。您需要一个可以及时回溯的查询,并追溯过滤源表以仅处理10%糖果消费的用户。幸运的是,这就是子查询的作用:

SELECT SUM(spent) FROM (
   SELECT SUM(Money_Spent) AS spent
   FROM MoneyTable
   WHERE (DATE >= '2010-01-01')
   GROUP BY UserID
   HAVING (SUM(Money_Spent_On_Candy)/SUM(Money_Spent)) > 0.1
);

内部查询确定了解决“10%”用户所花费的内容,然后外部查询使用子查询作为虚拟表来总结每个用户的Money_Spent总和。

当然,这仅在您需要全局总金额Money_Spent时才有效。如果您最终还需要每用户总和,那么您最好只运行内部查询并在应用程序中执行全局总计。

答案 1 :(得分:1)

您可以使用公用表表达式。像这样:

WITH temp AS (SELECT 
    UserId, 
    SUM(Money_Spent) AS MoneySpent, 
    SUM(Money_Spent_On_Candy)/SUM(Money_Spent) AS PercentCandySpend 
FROM MoneyTable 
WHERE DATE >= '2010-01-01' 
HAVING PercentCandySpend > 0.1)
SELECT
     UserId
     SUM(MoneySpent)
FROM UserId

答案 2 :(得分:1)

或者您可以使用派生表:

SELECT SUM(Total_Money_Spent)
FROM (    SELECT UserId, Total_Money_Spent = SUM(Money_Spent), SUM(Money_Spent_On_Candy)/SUM(Money_Spent) AS PercentCandySpend
          FROM MoneyTable
          WHERE DATE >= '2010-01-01'
          HAVING PercentCandySpend > 0.1 ) x;