#mysql #group-by #count #sum
#mysql #групповое #количество #сумма
Вопрос:
У меня есть таблица платежей со следующими полями:
- id (int)
- статус (успешно, сбой, возврат)
- сумма (int)
- pdate (формат Y-m-d)
Мне нужно написать запрос, чтобы получить за каждый день, сколько платежей было успешным, сколько неудачных и сколько было возвращено, с процентом за этот день. Мой текущий запрос таков:
select pdate, status, count(*) as total, sum(amount) as total_amount
from payments
group by pdate, status
Запрос успешно возвращает, сколько платежей было обработано за каждый день, и статус:
pdate status total total_amount
2019-04-01, successful, 10, 100
2019-04-01, failed, 5, 50
2019-04-01, refunded, 5, 50
2019-04-02, successful, 12, 120
2019-04-02, failed, 5, 50
2019-04-02, refunded, 3, 30
Но я не знаю, как заставить его вычислять процент для каждого платежа за каждый день. Например, для 2019-04-01
того, чтобы были 20
платежи so, процент successful
платежей = 50%
, failed
= 25%
и refunded
= 25%
.
Как я могу заставить его вернуть это:
pdate status total total_amount percentage
2019-04-01, successful, 10, 100, 50%
2019-04-01, failed, 5, 50, 25%
2019-04-01, refunded, 5, 50, 25%
2019-04-02, successful, 12, 120, 58.3%
2019-04-02, failed, 5, 50, 16.6%
2019-04-02, refunded, 3, 30, 25%
Как вы можете видеть, процент рассчитывается на основе общего количества платежей за каждый день.
Заранее спасибо!
Комментарии:
1. процент рассчитывается на основе общего количества платежей за каждый день , можете ли вы объяснить 58,3%?
Ответ №1:
Для этого вы можете использовать подзапрос в вашем операторе select. См. Ниже:
select
p1.pdate,
p1.status,
count(*) as total,
sum(p1.amount) as total_amount,
concat(round(( count(*)/
(select count(*) from payments p2 where p2.pdate = p1.pdate group by pdate )
* 100 ),2),'%') AS percentage
from
payments p1
group by pdate, status;
Это даст вам то, что вы ищете. Посмотрите на этот запущенный пример:
https://www.db-fiddle.com/f/e6a6CJb3pqLzcRz18SGeZ2/1
Комментарии:
1. Если это решит вашу проблему, можете ли вы принять это как ответ? Спасибо!