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
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.
- Certaines personnes lenseignent encore
- Certains ont
column number
dans les diagrammes SQL . Une ligne dit: Trie le résultat par le numéro de colonne donné, ou par une expression. Si lexpression est un paramètre unique, la valeur est interprétée comme un numéro de colonne. Les numéros de colonne négatifs inversent lordre de tri. - Apache a abandonné son utilisation car SQL Server la
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
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:
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
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).
order by 1
uniquement en position assise à linvitemysql>
. Dans le code, utilisezORDER BY id ASC
. Notez la casse, le nom du champ explicite et le sens de classement explicite.