对于大陆,国家和州,汇总表中的层次结构值

时间:2016-03-09 06:40:11

标签: sql sql-server database oracle

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查询。即将总结各州的人口以查找国家的人口。 同样,将总结各国人口以查找各大洲的人口。

3 个答案:

答案 0 :(得分:1)

如果你想在大陆之后求和,一种方法就是添加一个列大陆

大陆之后的总和

SELECT sum(Population) FROM yourTable GROUP BY continent. 

另一种方法就是使用硬编码列表

各大洲之后的总和

只需将sumgroup byREGEXP_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或游标。