MySQL вычисляет количество, сумму и процент с помощью group by

#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. Если это решит вашу проблему, можете ли вы принять это как ответ? Спасибо!