Mysql Получение результатов Группировка по сумме + строка с суммой удаленных строк - PullRequest
0 голосов
/ 14 марта 2020

У меня следующий вопрос в mysql:

из запроса, подобного этому:

select Category, count(*) as C 
from categories_likes 
group by Category 
order by C desc 
limit 3

Мне нужно получить такой результат:

Category | C
Love     | 10
Sad      | 5
Angry    | 3
Other    | 50

Где «Строка» - «Другое» - это сумма подсчетов в других категориях, которые не нужны в результате, но необходимы для группировки всех в одну последнюю строку.

Надеюсь, что кто-нибудь может мне помочь. Спасибо

1 Ответ

0 голосов
/ 14 марта 2020

Предположительно, вы хотите сгруппировать все категории, кроме "Любовь", "Грустно" и "Сердитый", в уникальную группу, которая называется "Другое".

Если это так, вы можете использовать case выражение:

select
    case 
        when category in ('Love', 'Sad', 'Angry') then category
        else 'Other'
    end new_category,
    count(*) cnt
from categories_like
group by new_category
order by (new_category = 'Other'), cnt desc

Обратите внимание, что предложение order by в запросе ставит категорию "Другое" в последнюю очередь.


Если вы хотите динамику c топ 3 из категорий с последующим общим подсчетом во всех остальных категориях, это немного отличается. Предполагая MySQL 8.0, вы можете использовать функцию ранжирования:

select case when rn <= 3  then category else 'Other' end new_category, sum(cnt) cnt
from (
    select category, count(*) cnt, rank() over(order by count(*) desc) rn
    from categories_like
    group by category
) t
group by new_category
order by (new_category = 'Other'), cnt desc

В более ранних версиях я бы предложил union all:

(
    select category new_category, count(*) cnt
    from categories_like
    group by category
    order by cnt desc
    limit 3
)
union all (
    select 'Other', sum(cnt)
    from (
        select category, count(*) cnt
        from categories_like
        group by category
        order by cnt desc
        limit 4, 1000
    ) t
)
order by (new_category = 'Other'), cnt desc 

Это предполагает, что есть не более 1000 категорий; при необходимости вы можете увеличить смещение подзапроса.

...