Compte tenu des structures de table suivantes: ... et cette requête ... p> Comment puis-je ajouter un Somme Code> du Exemple de données: P> régions.population Code> Pour calculer la population du pays? Je dois utiliser seulement la valeur de chaque région une fois en résumé, mais le résultat des Nations Unies a plusieurs rangées pour chaque région (nombre de villes dans cette région). P>
SELECT c.id AS country_id,
c.name AS country,
COUNT(x.region_id) AS regions,
SUM(x.population) AS population,
SUM(x.cities) AS cities
FROM countries AS c
LEFT JOIN (
SELECT r.country_id,
r.id AS region_id,
r.population AS population,
COUNT(s.id) AS cities
FROM regions AS r
LEFT JOIN cities AS s ON s.region_id = r.id
GROUP BY r.country_id, r.id, r.population
) AS x ON x.country_id = c.id
GROUP BY c.id, c.name
7 Réponses :
Utilisez Utilisez donc Essayez ceci: p> cochez le Sortie forte> p> | COUNTRY | REGIONS | POPULATION | CITIES |
|---------|---------|------------|--------|
| usa | 3 | 16 | 4 |
| germany | 2 | 5 | 1 |
Merci d'avoir discuté de la différence entre gauche code> et
interne code> jointures. J'étais déjà au courant, mais cette information est bonne pour les futurs lecteurs.
Que diriez-vous de quitter le reste et d'ajouter une autre jointure pour la population sqlfiddle Demo h2> p>
Tout d'abord, le Autre message Vous référence n'est pas la même situation. Dans ce cas, les jointures sont comme [A -> B et A -> C], donc la moyenne pondérée (qui est ce que le calcul fait) est correct. Dans votre cas, les joines sont comme [A -> B -> C], vous avez donc besoin d'une approche différente.
La solution la plus simple qui vient à l'esprit tout de suite implique une sous-requête, mais pas un complexe: P >
SELECT c.name AS country, COUNT(r.id) AS regions, SUM(s.city_count) AS cities, SUM(r.population) as population FROM countries AS c JOIN regions AS r ON r.country_id = c.id JOIN (select region_id, count(*) as city_count from cities group by region_id) AS s ON s.region_id = r.id GROUP BY c.id
Merci d'avoir illustré pourquoi cette autre solution ne s'applique pas à ma situation.
J'ai test dans SQL avec cette requête pour la même table que vous fournissez ci-dessous et j'ai obtenu le résultat que vous voulez p>
Pour commencer, vous devez savoir que la question et la solution mentionnée dans votre question sont un peu différentes de votre question et de sa solution. C'est pourquoi vous ne pouvez utiliser que Tables: strong> p> Pays: em> régions: em> p> villes: p > rejoindre code> S sans sous-requêtes.
=====================================================
| country | regions | cities | population |
=====================================================
| country 1 | 2 | 3 | 25 |
-----------------------------------------------------
| country 2 | 1 | 1 | 25 |
-----------------------------------------------------
Voici une autre façon de le faire, si vous ne voulez pas introduire / modifier un joindre code> ou un
sous-requête code>
Votre problème est assez courant. Vous rejoignez toutes les tables qui ont quelque chose à voir avec les données que vous souhaitez voir, puis vous commencez à réfléchir à la manière d'accéder à ces données. En ce qui concerne des agrégations différentes comme dans votre cas, cela n'est pas facile à réaliser.
Do mieux rejoindre ce que vous êtes réellement intéressé. Dans votre cas: pays et région (agrégés) de la région / des données de la ville par pays. Cela empêche la requête directe directe et facile à entretenir. P>
select c.name as country, r.regions, r.population, r.cities from countries as c join ( select country_id, count(*) as regions, sum(population) as population, sum((select count(*) from cities where cities.region_id = regions.id)) as cities from regions group by country_id ) as r on r.country_id = c.id;
Sûr de cette requête? Vous sélectionnez le nom de la ville comme «pays» et groupez par l'ID de la ville?
Avez-vous besoin de la population par région ou par pays?
Mon erreur. J'ai corrigé les alias. Je veux la population du pays.