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非常感谢您的通知。只是为了一大早。我更新了我的答案。很好。一个小错误:你有一个迷路的
代码>在你发言的开头。谢谢你,弗兰克·施密特