Sql 表中大陆、国家和州的等级值总和

Sql 表中大陆、国家和州的等级值总和,sql,sql-server,database,oracle,Sql,Sql Server,Database,Oracle,按人口结构排序 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) >

按人口结构排序

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查询来返回每一级的人口。i、 e.将各州的人口相加,得出该国的人口。
同样地,将国家的人口相加以找到大陆的人口。

如果要在大陆之后求和,一种方法是只添加一列大陆

大陆之后的总和为

SELECT sum(Population) FROM yourTable GROUP BY continent. 
另一种方法是类似这样的硬编码列表

大陆之后的总和

只需将
sum
groupby
REGEXP\u SUBSTR
一起使用in和硬编码列表即可。就我而言,德国、英国应该代表欧洲

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

如果您想在不同的视图或特定的国家中获取某个国家和大陆的数据,Kordi的解决方案将对您有所帮助。但是,如果希望在单个视图中查看所有视图,并且在herarchy中只有两个级别,则可以使用此查询

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

注意:如果您有两个以上的层次结构级别,则此查询的两个变通方法是,在存储过程或函数中使用XML路径或游标。

您可以使用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

我猜你会把“国家”条目和“国家”条目按名称联系起来。但是,你如何将非洲大陆与这些国家联系起来?通过对ID字段进行排序?我认为实现您想要的最简单的方法是通过函数或存储过程并在光标上迭代:有没有办法找出哪个国家属于哪个大陆,哪个国家属于哪个国家?我的意思是,我们中的一些人知道印度在亚洲,但数据库却不知道。最新评论:使用此解决方案将为他提供国家的摘要,而不是大陆的摘要。@Rumpelstinsk非常感谢您的通知。只是为了一大早。我更新了我的答案。很好。一个小错误:你有一个迷路的
在你发言的开头。谢谢你,弗兰克·施密特