Как выбрать суммы определенного 'id' и разделить результат по группам - PullRequest
0 голосов
/ 07 сентября 2018

В этом запросе я пытаюсь выбрать суммы платежей, которые сделали пользователи:

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 ..." Но теперь мне нужно знать сумму платежей, которые пользователи сделали в каждой группе.

Спасибо, если вы попытаетесь помочь!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если я правильно понял, нет необходимости во всех этих подзапросах. Простые 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
0 голосов
/ 07 сентября 2018

Я думаю, вам нужен один из 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

или этого (сумма Amount между 2000-01-01 и 2001-01-01, деленная на общую суммузаписей для конкретного пользователя):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...