首页 > 解决方案 > 如何选择某些“id”的总和并按组划分结果

问题描述

在这个查询中,我尝试选择用户支付的总金额:

SELECT *
from (select IFnull(t.diapason,'total') as diapason,
t.total_amount as total_amount 

FROM 
(SELECT p.user_id, p.amount as total_amount, CASE
when amount<=100 then '0-100'
when amount>100 then '100...' END AS diapason
FROM (SELECT distinct payments.user_id, SUM(amount) AS amount 
FROM payments inner JOIN (SELECT DISTINCT user_id FROM payments where 
     payment_time between '2000-01-01' and '2001-01-01') a ON 
payments.user_id = a.user_id 
GROUP BY payments.user_id) p) t  
GROUP BY diapason WITH ROLLUP) as t1  
ORDER BY total_amount desc;

但是我得到的结果是错误的。我应该改变什么来找出 2000-01-01 - 2001-01-01 期间的付款总额。由于用户曾经做过付款,结果必须按组划分。

这些是表活动和付款。

activity
user_id   login_time
1         2000-01-01
2         2000-03-01
....

payments
user_id     payment_time    amount
1          2000-05-04        10
1          2000-03-01        20
2          2000-04-05        5
...

通常,由每个用户支付的总金额组成的组。例如,如果他支付了 50 美元 - 他在组“0-100”中。如果他支付了 500 - 他在“100 ...”组中,但现在我需要知道每个组中用户支付的总和。

谢谢,如果你会尝试帮助!

标签: mysqlsqldatabasejoinselect

解决方案


如果我理解正确,则不需要所有这些子查询。很简单sumgroup by应该这样做:

SELECT t1.user_id, sum(t2.amount) as total, IF(sum(t2.amount)<=100, '0-100',  '100...') as grp 
FROM t1
INNER JOIN t2 on t1.user_id = t2.user_id
WHERE t2.payment_time between '2000-01-01' and '2001-01-01'
GROUP BY t1.user_id

推荐阅读