7
votes

Trier le "Rollup" dans le groupe par

J'ai trouvé que l'option "avec le rouleau" utilisé avec le groupe par est très utile. Mais cela ne se comporte pas avec la clause "ordre par". Y a-t-il un moyen de commander à la manière dont je veux aussi bien que calculer les sous-totaux? XXX


0 commentaires

6 Réponses :


17
votes

Essayez comme Utiliser une table temporaire

 SELECT * 
 FROM 
 (
     SELECT country, sum(id) as cnt 
     FROM mygroup GROUP BY country WITH rollup
 ) t 
 ORDER BY cnt;


1 commentaires

La requête réelle a plusieurs colonnes du groupe par clause. L'utilisation de votre suggestion commande les sous-totaux et qui n'est pas souhaitable.



14
votes

Avez-vous essayé de mettre la commande dans le groupement? xxx

devrait revenir: xxx

http://dev.mysql.com/doc/refman/5.0/fr/group-by-modifiers.html < / p>


2 commentaires

Le groupe par clause est par défaut trié. J'ai besoin de trier la somme (id)


Ah! Désolé j'ai mal compris la question! Tout devient clair maintenant. :)



1
votes

solution

Utilisez deux sous-requêtes, comme celle-ci: xxx

résultat doit être commandé par CNT et avec des sous-totaux dans la dernière ligne: xxx


0 commentaires

3
votes

Vous pouvez essayer cette requête:

 SELECT country,id
     FROM mygroup GROUP BY country ASC WITH ROLLUP


3 commentaires

C'est la meilleure réponse car les sous-demandes sont mauvaises pour la performance sur les grands ensembles de données.


Il ne répond pas à l'OP qui doit trier par la somme de Rollup, pas la catégorie


@Derokorian une réponse qui ne fonctionne pas ne peut être meilleure. et les sous-requêtes sont souvent le moyen le plus efficace de faire quelque chose; Tout dépend de beaucoup de choses.



1
votes

La solution de deux sous-requêtes est inutilement compliquée. Vous avez juste besoin d'un et pas de numéro de série.

select country, cnt
from (
    select
        country,
        sum(id) as cnt
    from mygroup
    group by country with rollup
) mygroup_with_rollup
order by country is null, cnt, country;


0 commentaires

0
votes

Il semblerait que depuis 2017 MySQL a eu le groupement ( ) une fonction. Cela fonctionne lors de l'utilisation de la commande. En outre, le groupe par et l'ordre par peut désormais coexister (la 3ème requête de votre question d'origine ne jette plus d'erreur), mais il a des défauts lorsque vous essayez de trier les données, typiquement que cela jette le rouleau au sommet de la table. Lorsque DESC, mais il y a d'autres problèmes à ce que je démontrerai, puis montrer comment le réparer. Jetons une clé dans les données d'origine: xxx

à l'aide de la méthode de la table temporaire indiquée ci-dessus, vous aurez ces résultats là où le NULL / ROLLUP apparaît au milieu de la table, ce qui est un autre problème, probablement encore pire que ce qu'il va au sommet: xxx

Nous ne voulons probablement pas cela, en utilisant le nouveau groupe de mots-clés () Nous sommes en mesure de trier les articles par leur Les groupements d'abord, puis dans chaque groupe par des colonnes individuelles: xxx

résultats (de Desc): xxx

le groupement ( ) La méthode est une version mise à jour qui vous obtient ce dont vous avez besoin et que vous avez l'avantage supplémentaire de vous assurer que le rouleau apparaît où vous le souhaitez.


0 commentaires