Mysql
 sql >> Base de données >  >> RDS >> Mysql

Regrouper par nombre de (Top 5) et nombre de (tous les autres)

Dans MySQL, le moyen le plus simple d'exprimer cela est probablement d'utiliser une table temporaire :

create temporary table temp as (
    id int not null auto_increment,
    CaseLabel varchar(255),
    CasesResolved int
);

insert into temp(CaseLabel, CasesResolved)
    SELECT deskcases.Labels, COUNT(deskcases.Labels)AS CaseCount
    FROM deskcases
    WHERE deskcases.Labels NOT LIKE ''
          AND deskcases.Labels NOT LIKE '%SPAM%'
          AND deskcases.Labels NOT LIKE '%Online Orders%'
          AND deskcases.Labels NOT LIKE '%Internal SPAM%'
          AND deskcases.`Case Status` LIKE 'Resolved'
          AND deskcases.`Resolved At` > CURDATE()- INTERVAL 7 DAY
    GROUP BY deskcases.Labels
    ORDER BY CaseCount DESC;

select (case when id <= 5 then caselabel else 'Other' end),
       SUM(casesResolved) as CasesResolved
from temp
group by (case when id <= 5 then caselabel else 'Other' end)
order by MAX(id) desc

L'id colonne dans la table temporaire ajoute un numéro de ligne sur chaque ligne. Dans toute autre base de données réelle, vous utiliseriez le row_number() fonction, mais MySQL ne le supporte pas.