首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TSQL从平面数据创建分层数据

使用TSQL从平面数据创建分层数据
EN

Stack Overflow用户
提问于 2017-04-03 21:25:54
回答 1查看 59关注 0票数 1

给出了包含以下数据的表格:

代码语言:javascript
复制
Country     City
---------------------
Afghanistan Kabul
Afghanistan Kandahar
Australia   Canberra
Australia   Sydney
Belgium     Antwerp
Belgium     Bruges
Belgium     Brussels

我可以在一个sql语句中返回以下数据吗?

代码语言:javascript
复制
ID  ParentID    Level   Letter  Country         City
---------------------------------------------------------
1   NULL        0       A       NULL            NULL
2   1           1       NULL    Afghanistan     NULL
3   2           2       NULL    NULL            Kabul
4   2           2       NULL    NULL            Kandahar
6   1           1       NULL    Australia       NULL
7   6           2       NULL    NULL            Canberra
8   6           2       NULL    NULL            Sydney
9   NULL        0       B       NULL            NULL
10  9           1       NULL    Belgium         NULL
11  10          2       NULL    NULL            Antwerp
12  10          2       NULL    NULL            Bruges
13  10          2       NULL    NULL            Brussels
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-04 00:34:33

代码语言:javascript
复制
Declare @YourTable table (Country varchar(50), City varchar(50))
Insert Into @YourTable values
('Afghanistan','Kabul'),
('Afghanistan','Kandahar'),
('Australia'  ,'Canberra'),
('Australia'  ,'Sydney'),
('Belgium'    ,'Antwerp'),
('Belgium'    ,'Bruges'),
('Belgium'    ,'Brussels')

; with cte0 as (
                Select Lvl0 = cast(Left(Country,1) as varchar(50))
                      ,Lvl1 = cast(Country as varchar(50))
                      ,Lvl2 = cast(City as varchar(50))
                      ,ID0  = Dense_Rank() over (Order By Left(Country,1))
                      ,ID1  = Dense_Rank() over (Order By Country) + 100
                      ,ID2  = Dense_Rank() over (Order By City) + 10000
                 From  @YourTable
               )
Select Distinct ID=ID0,ParentID=null,Level=0,Letter=Lvl0,Country=null,City=null,Path=concat('',Lvl0) from cte0
Union All
Select Distinct ID=ID1,ParentID=ID0,Level=1,Letter=null,Country=Lvl1,City=null,Path=concat('',Lvl0,' > ',Lvl1) from cte0
Union All
Select Distinct ID=ID2,ParentID=ID1,Level=2,Letter=null,Country=null,City=Lvl2,Path=concat('',Lvl0,' > ',Lvl1,' > ',Lvl2) from cte0
Order By Path

返回

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43194574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档