Dans les requêtes SQL, nous utilisons la clause Group by pour appliquer des fonctions dagrégation.

  • Mais quel est le but de lutilisation de la valeur numérique au lieu du nom de colonne avec la clause Group by? Par exemple: Grouper par 1.

Commentaires

  • Utilisez order by 1 uniquement en position assise à linvite mysql> . Dans le code, utilisez ORDER BY id ASC. Notez la casse, le nom du champ explicite et le sens de classement explicite.

Réponse

Cest en fait une très mauvaise chose à faire à mon humble avis, et ce nest pas pris en charge dans la plupart des autres plates-formes de base de données.

Les raisons pour lesquelles les gens le font:

  • they « re paresseux – Je ne sais pas pourquoi les gens pensent que leur productivité est améliorée en écrivant un code laconique plutôt quen tapant pendant 40 millisecondes supplémentaires pour obtenir un code beaucoup plus littéral.

Les raisons pour lesquelles cest mauvais:

  • ce nest pas auto-documenté – quelquun va devoir analyser la liste SELECT pour déterminer le regroupement. Ce serait en fait un peu plus clair dans SQL Server, qui ne prend pas en charge les cow-boys qui- sait-ce-qui-va-se passer comme le fait MySQL.

  • il « est fragile – quelquun entre et modifie la liste SELECT parce que les utilisateurs professionnels voulaient une sortie de rapport différente, et maintenant votre sortie est en désordre. Si vous aviez utilisé des noms de colonnes dans le GROUP BY, lordre dans la liste SELECT naurait pas dimportance.

SQL Server prend en charge ORDER BY [ordinal]; voici quelques arguments parallèles contre son utilisation:

Réponse

MySQL vous permet de faire GROUP BY avec des alias ( Problèmes avec les alias de colonne ). Ce serait bien mieux que de faire GROUP BY avec des nombres.

Google a de nombreux exemples dutilisation et pourquoi beaucoup ont cessé de lutiliser.

Pour être honnête avec vous, je nai « pas utilisé de numéros de colonne pour ORDER BY et GROUP BY depuis 1996 (je faisais du développement Oracle PL / SQL à lépoque). Lutilisation des numéros de colonne est vraiment réservée aux anciens et la rétrocompatibilité permet à ces développeurs dutiliser MySQL et dautres SGBDR qui permettez-le toujours.

Réponse

Considérez le cas ci-dessous:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Vous devez connaître le nombre de téléchargements par service et par jour en considérant les applications et les applications comme le même service. Le regroupement par date, services aboutirait à ce que Apps et Applications soient considérés comme des services distincts.

Dans ce cas, la requête serait:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Et la sortie:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Mais ce nest pas ce que vous voulez, car les applications et les applications doivent être regroupées. Alors, que pouvons-nous faire?

Une façon est de remplacer Apps par Applications en utilisant un CASE ou la fonction IF puis les regrouper sur les services comme:

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Mais cela regroupe toujours les services en considérant Apps et Applications comme des services différents et donne le même résultat que précédemment:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Le regroupement sur un numéro de colonne vous permet de regrouper des données sur une colonne aliasée.

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

Et vous donnant ainsi la sortie souhaitée comme ci-dessous:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

I « ve lu plusieurs fois que cest une manière paresseuse décrire des requêtes ou de regrouper sur une colonne aliasée ne fonctionne pas dans MySQL, mais cest la manière de grouper sur des colonnes aliasées.

Ce nest pas la méthode préférée pour écrire des requêtes, utilisez-la uniquement lorsque vous devez vraiment regrouper sur une colonne aliasée.

Commentaires

  •  » Mais cela regroupe toujours les services en considérant les applications et les applications comme des services différents et donne le même résultat que précédemment « .Ce problème ‘ ne serait-il pas résolu si vous ‘ avez choisi un nom différent (non conflictuel) pour lalias?
  • @ Daddy32 Exactement ma pensée. Ou même imbriquer une fois de plus (groupe après sélection)

Réponse

Il ny a aucune raison valable de lutiliser. Il sagit simplement dun raccourci paresseux spécialement conçu pour empêcher certains développeurs pressés de comprendre votre regroupement ou votre tri plus tard ou pour permettre au code déchouer lamentablement lorsque quelquun change lordre des colonnes. Soyez attentif à vos collègues développeurs et ne le faites pas.

Réponse

Cela fonctionne pour moi. Le code regroupe les lignes jusquà 5 groupes.

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

Le résultat sera le suivant

entrez la description de limage ici

Réponse

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

Considérez les requêtes ci-dessus: Grouper par 1 signifie grouper par la première colonne et grouper par 1,2 signifie grouper par la première et la deuxième colonne et grouper par 1,2,3 signifie grouper par première deuxième et troisième colonnes. Par exemple:

grouper par 1,2

cette image montre les deux premières colonnes regroupées par 1,2 cest-à-dire quil ne tient pas compte des différentes valeurs de dep_date pour trouver le décompte (pour calculer le décompte, toutes les combinaisons distinctes des deux premières colonnes sont prises en considération) alors que la deuxième requête aboutit à ceci grouper par 1,2,3

image. Ici, il considère les trois premières colonnes et des valeurs différentes pour trouver le compte, cest-à-dire quil regroupe les trois premières colonnes (pour calculer le compte, toutes les combinaisons distinctes des trois premières colonnes sont prises en considération).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *