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!
3 Réponses :
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
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
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
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
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;
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!
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.