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.