在此查询中,我尝试选择用户已付款的金额:
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年1月1日至2001年1月1日之间的工资总额。由于用户曾经付款,结果必须按组划分。
这些是表格活动和付款。
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 ...”组,但是现在我需要知道每个组中用户的付款总额。
谢谢您的帮助!
答案 0 :(得分:0)
我认为您需要SUM
或AVG
之一:
SELECT user_id,
SUM(Amount) `sum`,
AVG(Amount) `avg`
FROM payments
WHERE payment_time BETWEEN '2000-01-01' AND '2001-01-01'
GROUP BY ser_id
或此数(2000年1月1日至2001年1月1日之间Amount
的总和除以特定用户的记录总数):
SELECT user_id,
SUM(CASE WHEN payment_time BETWEEN '2000-01-01' AND '2001-01-01' THEN Amount ELSE 0 END) / COUNT(*) `customAvg`
FROM payments
WHERE payment_time BETWEEN '2000-01-01' AND '2001-01-01'
GROUP BY ser_id
答案 1 :(得分:0)
如果我理解正确,则不需要所有这些子查询。
简单的sum
和group 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