Как считать транзакции на основе бинов и типа

#mysql #sql #count #pivot #case

#mysql #sql #подсчитывать #сводная #случай

Вопрос:

У меня есть следующая таблица в базе данных MySQL.

введите описание изображения здесь

Мне нужно создать отчет с учетом ячеек (на основе количества и типа) введите описание изображения здесь

Я попытался использовать следующий код

 select TYPE, 
        case when TYPE is null
            then @total := count(*)
            else count(*)
        end as counter
    from mytable
    group by TYPE
    with rollup
  

Однако я не могу получить отчет в указанном выше формате.

Ответ №1:

Вы можете вычислить сегменты в подзапросе, а затем выполнить условную агрегацию во внешнем запросе:

 select
    amount_range,
    sum(type = 'A') typeA,
    sum(type = 'B') typeB,
    sum(type = 'C') typeC,
    sum(type = 'D') typeD,
    count(*) all_types
from (
    select t.*, 
        case 
            when amount > 1100 then '1001-1300'
            when amount >  900 then '901-1100'
            when amount >  700 then '701-900'
            else '500-700'
        end as amount_range
    from mytable
    where amount between 500 and 1300
) t
group by amount_range
  

На самом деле, нет реальной необходимости в подзапросе. В MySQL вы можете сделать:

 select
    case 
        when amount > 1100 then '1001-1300'
        when amount >  900 then '901-1100'
        when amount >  700 then '701-900'
        else '500-700'
    end as amount_range,
    sum(type = 'A') typeA,
    sum(type = 'B') typeB,
    sum(type = 'C') typeC,
    sum(type = 'D') typeD,
    count(*) all_types
from mytable
where amount between 500 and 1300
group by amount_range
  

Редактировать

Если вам нужны соотношения общего количества записей, используйте оконные функции (доступны в MySQL 8.0):

 select
    case 
        when amount > 1100 then '1001-1300'
        when amount >  900 then '901-1100'
        when amount >  700 then '701-900'
        else '500-700'
    end as amount_range,
    sum(type = 'A')/sum(count(*)) over() typeA_ratio,
    sum(type = 'B')/sum(count(*)) over() typeB_ratio,
    sum(type = 'C')/sum(count(*)) over() typeC_ratio,
    sum(type = 'D')/sum(count(*)) over() typeD_ratio,
    count(*)/sum(count(*)) over() all_types_ratio
from mytable
where amount between 500 and 1300
group by amount_range
  

Комментарии:

1. Привет, ваш код сработал. Однако теперь мое требование состоит в том, чтобы получить процент от общего количества записей. Не могли бы вы обновить ответ?

2. @NikhilKumarSingh: не рекомендуется редактировать вопрос после публикации ответов (это делает недействительными хорошие ответы). Поскольку это довольно простое изменение, я отредактировал ответ на этот раз.

3. over() выдает синтаксическую ошибку, когда я использую ее вне среды MySQL workbench.