#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.