Somme des valeurs hiérarchiques dans le tableau pour le continent, les pays et les états

Cosider suivant la structure pour la population.

Asia(100+50+150=300) > China (20+80=100) > China_StateA (20) > China_StateB (80) > KSA (10+40=50) > KSA_StateA (10) > KSA_StateB (40) > India (70+80=150) > India_StateA (70) > India_StateB (80) Europe(50+15=65) > England (50) > England_StateA (20) > England_StateB (30) > Ireland (5+10=15) > Ireland_StateA (5) > Ireland_StateB (10) 

Si j'ai la même structure dans une seule table de database comme suit

 Id Type Name ParentId Population 1 Continent Asia 0 2 Country China 1 3 State China_StateA 2 20 4 State China_StateB 2 80 5 Country KSA 1 6 State KSA_StateA 5 10 7 State KSA_StateB 5 40 8 Country India 1 9 State India_StateA 8 70 10 State India_StateB 8 80 11 Continent Europe 0 12 Country England 11 13 State England_StateA 12 20 14 State England_StateB 12 30 15 Country Ireland 11 16 State Ireland_StateA 15 5 17 State Ireland_StateB 15 10 

Alors comment puis-je écrire une requête sql qui va returnner la population à chaque niveau. c'est-à-dire résumer la population des états pour find la population du pays. De même résumera la population des pays pour find la population des continents.

Si vous voulez faire une sum après les continents, une approche consiste simplement à append un continent de colonne

La sum après le continent est alors

 SELECT sum(Population) FROM yourTable GROUP BY continent. 

Une autre approche est quelque chose comme ça avec une list codée en dur

Somme après les continents

Utilisez simplement sum et group by avec REGEXP_SUBSTR avec in et une list codée en dur. Dans mon cas l'Allemagne, l'Angleterre devrait représenter l'Europe.

 SELECT sum(Population) FROM yourTable GROUP BY REGEXP_SUBSTR('Name','(.*)_?') IN ('England', 'Germany') 

Vous pouvez le faire en utilisant CTE

 WITH CTE_TMP AS ( SELECT Id,[Type],Name,ParentId,[Population] FROM MyTable WHERE [Type] = 'State' UNION ALL SELECT M.Id,M.[Type],M.Name,M.ParentId,ISNULL(C.[Population],0) FROM MyTable M INNER JOIN CTE_TMP C ON M.Id = C.ParentId ) SELECT Id,[Type],Name,ParentId,SUM([Population]) AS [Population] FROM CTE_TMP GROUP BY Id,[Type],Name,ParentId ORDER BY id 

La solution de Kordi vous aidera, si vous voulez get datatables pour des pays et des continents dans des vues séparées ou des pays spécifiques. Mais si vous voulez tout voir dans une seule vue, et vous avez seulement 2 niveaux dans votre hérésie, vous pouvez utiliser cette requête.

 SELECT parent.Id parent.Name, parent.ParentId SUM(childs.Population) FROM mytable parent INNER JOIN mytable childs ON parent.Id = childs.ParentId WHERE parent.Type = 'Continent' GroupBy parent.Id, parent.Name, parent.ParentId UNION SELECT parent.Id parent.Name, parent.ParentId SUM(childs.Population) FROM mytable parent INNER JOIN mytable childs ON parent.Id = childs.ParentId WHERE parent.Type = 'Country' GroupBy parent.Id, parent.Name, parent.ParentId 

Remarque: Si vous avez plus de 2 niveaux de hiérarchie, 2 solutions de contournement à cette requête sont en utilisant XML PATH ou des sliders dans une procédure ou une fonction de magasin.