Cosider遵循人口结构。
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)
如果我在单个数据库表中具有相同的结构,如下所示
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
然后,我如何编写一个将返回每个级别的填充的SQL查询。即将总结各州的人口以查找国家的人口。 同样,将总结各国人口以查找各大洲的人口。
答案 0 :(得分:1)
如果你想在大陆之后求和,一种方法就是添加一个列大陆
大陆之后的总和
SELECT sum(Population) FROM yourTable GROUP BY continent.
另一种方法就是使用硬编码列表
各大洲之后的总和
只需将sum
和group by
与REGEXP_SUBSTR
一起使用,并使用硬编码列表。在我的德国案例中,英格兰应该代表欧洲。
SELECT sum(Population) FROM yourTable GROUP BY REGEXP_SUBSTR('Name','(.*)_?') IN ('England', 'Germany')
答案 1 :(得分:1)
您可以使用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
答案 2 :(得分:0)
如果您想在不同的视图或特定国家/地区获取国家/地区的数据,Kordi的解决方案将为您提供帮助。但是如果你想在一个视图中看到all,并且你的层次结构只有2个级别,你可以使用这个查询。
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
注意:如果您有超过2个层次结构级别,则此查询的2个解决方法是使用存储过程或函数内的XML PATH或游标。