从原始数据准备树

时间:2016-04-06 20:41:48

标签: sql sql-server

我有一个像下面这样的平面数据结构,我想创建一个树。

----City------------------------State --------Land Area
------------------------------------------
1--------Sitka------------- Alaska--------2,870.30
2--------Juneau----------- Alaska--------2,701.90
3--------Wrangell-----------Alaska--------2,541.50
4--------Anchorage---------Alaska--------1,704.70
5--------Jacksonville--------Florida--------747
6--------Anaconda--------------------------------736.5
7--------Butte----------------------------------------716.2
8--------Oklahoma City------------------------601.11
9--------Houston--------------------------------599.6
10-------Nashville--------------------------------527.9
11-------Phoenix--------------------------------516.7
12-------Los Angeles-----------------------468.7
13-------San Antonio--------Texas--------460.9
14-------Suffolk **----------Virginia--------400.2
15-------Buckeye--------------------------------375.3
16-------Indianapolis--------------------------------361.4
17-------Chesapeake **-----Virginia--------340.8
18-------Dallas--------------Texas--------340.5
19-------Fort Worth---------Texas--------339.8
20-------Louisville-------------------------------325.2
21-------San Diego--------------------------------325.2
22-------Memphis--------------------------------315.1
23-------Kansas City--------------------------------313.5
24-------New York City------------------------302.6
25-------Augusta--------------------------------302.5
26-------Austin----------------Texas--------297.9

树应如下所示 它应该打印城市和土地面积 如果城市国家存在,则应首先显示州,然后城市和土地面积将是该城市的子女,类似于以下结构。

Alaska----------------9818.4
--------Anchorage--------1704.7
--------Juneau--------2701.9
--------Sitka--------2870.3
--------Wrangell--------2541.5
Florida----------------747
--------Jacksonville--------747
Texas----------------1439.1
--------Austin--------297.9
--------Dallas--------340.5
--------Fort Worth--------339.8
--------San Antonio--------460.9
Virginia Total----------------741
--------Chesapeake **--------340.8
--------Suffolk **--------400.2
Anaconda----------------736.5
Augusta----------------302.5
Buckeye----------------375.3
Butte----------------716.2
Houston----------------599.6
Indianapolis----------------361.4
Kansas City----------------313.5
Los Angeles----------------468.7
Louisville----------------325.2
Memphis----------------315.1
Nashville----------------527.9
New York City----------------302.6
Oklahoma City----------------601.11
Phoenix----------------516.7
San Diego----------------325.2

请通过撰写查询告诉我如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

试试这个

declare @StateArea TABLE ( SNo int ,City varchar(50) ,[State] varchar(50) , area float)

insert into @StateArea values ( 1,'Sitka'  ,'Alaska', 2870.30 )
insert into @StateArea values ( 2, 'Juneau'  ,'Alaska', 2701.90) 
insert into @StateArea values ( 3, 'Wrangell' ,'Alaska', 2541.50) 
insert into @StateArea values ( 4, 'Anchorage' ,'Alaska', 1704.70) 
insert into @StateArea values ( 5, 'Jacksonville' ,'Florida', 747 )
insert into @StateArea values ( 6, 'Anaconda', NULL ,  736.5 )
insert into @StateArea values ( 7, 'Butte', NULL ,    716.2 )
insert into @StateArea values (8, 'Oklahoma City',NULL ,  601.11 )
insert into @StateArea values (9, 'Houston' ,  NULL , 599.6 )
insert into @StateArea values (10, 'Nashville', NULL ,  527.9 )
insert into @StateArea values (11, 'Phoenix' , NULL ,  516.7 )
insert into @StateArea values (12, 'Los Angeles', NULL ,  468.7) 
insert into @StateArea values (13, 'San Antonio' ,'Texas', 460.9) 
insert into @StateArea values (14, 'Suffolk **' ,'Virginia', 400.2) 
insert into @StateArea values (15, 'Buckeye' ,NULL ,375.3) 
insert into @StateArea values (16, 'Indianapolis' ,NULL ,   361.4 )
insert into @StateArea values (17, 'Chesapeake **' ,'Virginia', 340.8 )
insert into @StateArea values (18, 'Dallas'  ,'Texas', 340.5 )
insert into @StateArea values (19,  'Fort Worth' ,'Texas', 339.8) 
insert into @StateArea values (20, 'Louisville' ,NULL ,   325.2 )
insert into @StateArea values (21, 'San Diego' , NULL ,  325.2 )
insert into @StateArea values (22, 'Memphis',  NULL ,  315.1 )
insert into @StateArea values (23, 'Kansas City' ,  NULL , 313.5) 
insert into @StateArea values (24, 'New York City', NULL ,  302.6 )
insert into @StateArea values (25,'Augusta' , NULL ,  302.5 )
insert into @StateArea values (26,'Austin'  ,'Texas', 297.9)

select [State],City,area from 
(
    select isnull([State],City) as [State],null as City,sum(area) as area 
    ,case when [State] is not null then 0 else 1 end as sort from @StateArea
    group by isnull([State],City),case when [State] is not null then 0 else 1 end
    union all
    select [State] ,City,area ,case when [State] is not null then 0 else 1 end as sort
    from @StateArea
    where [State] is not null
) t
order by sort,[State],City