1
votes

Group By dans MySQL - Pays et leurs langues respectives avec la langue la plus populaire en haut

J'ai un tableau avec une liste de pays appelés country et un autre tableau avec une liste de langues parlées dans chaque pays appelé countrylanguage . Les deux tables ont un code pour les pays sur lesquels une jointure peut être utilisée.

Je souhaite group by pays et afficher les langues parlées dans chaque pays avec le pourcentage de langue le plus élevé en haut, le reste descendant en dessous. Exemple:

    Aruba - Papiamento -  76.7 
            English    -  9.5
            Spanish    -  7.4
            Dutch      -  5.3

Idem pour chaque pays du tableau. Voici un échantillon de 10 lignes de chaque tableau. J'apprécierais grandement toute aide. Merci! entrez la description de l'image ici


1 commentaires

La plupart des gens ici veulent des exemples de données de table et le résultat attendu sous forme de texte formaté, pas d'images.


3 Réponses :


1
votes

Vous pouvez essayer ci-dessous -

select c.name,cl.language,cl.percentage 
from country c join countrylanguage cl on c.code=cl.countrycode
order by c.name, cl.percentage desc


2 commentaires

Cela me donne deux colonnes - nom du pays et pourcentage. J'essaie d'obtenir le pays, les langues utilisées dans ce pays et ensuite le pourcentage décroissant. Merci pour votre effort!


@FaisalMalik, a mis à jour la réponse - vous pouvez vérifier maintenant



0
votes

Vous pouvez utiliser LEFT JOIN pour vous aider à réaliser ce que vous demandez;

Le mot clé LEFT JOIN renvoie tous les enregistrements de la table de gauche (table1) et les enregistrements correspondants de la table de droite (table2). Le résultat est NULL du côté droit, s'il n'y a pas de correspondance. ¹

Syntaxe du code

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

EXEMPLE DE SORTIE

|  name |  language  | percentage |
|:-----:|:----------:|:----------:|
| Aruba | Papiamento |    76.7    |
| Aruba |   English  |     9.5    |
| Aruba |   Spanish  |     7.4    |
| Aruba |    Dutch   |     5.3    |

Diagramme de jointure gauche

joint gauche

Alors, pourquoi vous ne pouvez pas utiliser group by dans votre requête?

L'instruction GROUP BY regroupe les lignes qui ont les mêmes valeurs dans des lignes récapitulatives, comme "trouver le nombre de clients dans chaque pays".

L'instruction GROUP BY est souvent utilisée avec des fonctions d'agrégation (COUNT, MAX, MIN, SUM, AVG) pour regrouper l'ensemble de résultats par une ou plusieurs colonnes. ²

GROUP BY Syntaxe

SELECT country.name, countrylanguage.language, countrylanguage.percentage FROM county
LEFT JOIN countrylanguage 
ON country.code = countrylanguage.countryCode
ORDER BY country.name ASC, countrylanguage.percentage DESC


0 commentaires

0
votes

Je recommande de remplir la colonne de pays sur toutes les lignes:

select (case when row_number() over (partition by c.code order by cl.percentage desc) = 1
             then c.name
        end), cl.language, cl.percentage 
from country c join
     countrylanguage cl
     on c.code = cl.countrycode
order by c.name, cl.percentage desc;

Cependant, si vous voulez vraiment ignorer le pays sur tous sauf la première ligne, utilisez row_number() et la logique conditionnelle:

select c.name, cl.language, cl.percentage 
from country c join
     countrylanguage cl
     on c.code = cl.countrycode
order by c.name, cl.percentage desc;


1 commentaires

Merci pour votre aide, la deuxième solution est ce que j'essayais d'obtenir. La seule chose est que j'obtiens des valeurs nulles sous chaque nom de pays, mais je suppose que c'est correct. Merci encore!