我有一个表格,我们记录每个用户的值,如money_spent,money_spent_on_candy和日期。
所以这个表中的列(我们称之为MoneyTable)将是:
我的目标是减少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;
答案 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;