我有一个表AA,有三个字段:区域等级,区域名称,部门名称
数据记录如下:
区域等级 区域名称 部门名称
1 广州区域 广州总部营业部
2 番禺区域 番禺石基营业部
2 番禺区域 广州总部营业部
3 佛山区域 佛山大沥营业部
等等
我想得到下面的结果
一级区域名称 二级区域名称 三级区域 部门
广州区域 番禺区域 广州总部营业部
番禺区域 番禺石基营业部
佛山区域 佛山大沥营业部即:
(1)A表中有N级区域,结果表中就有N+1个字须.
(2)结果表中部门名称必须唯一.
数据记录如下:
区域等级 区域名称 部门名称
1 广州区域 广州总部营业部
2 番禺区域 番禺石基营业部
2 番禺区域 广州总部营业部
3 佛山区域 佛山大沥营业部
等等
我想得到下面的结果
一级区域名称 二级区域名称 三级区域 部门
广州区域 番禺区域 广州总部营业部
番禺区域 番禺石基营业部
佛山区域 佛山大沥营业部即:
(1)A表中有N级区域,结果表中就有N+1个字须.
(2)结果表中部门名称必须唯一.
具体怎么做?能不能说得具体点!
1 0 广州区域 广州总部营业部
2 1 番禺区域 番禺石基营业部
3 1 番禺区域 广州总部营业部
4 3 佛山区域 佛山大沥营业部 这样的设计即可支持无限级, 对数据存储顺序也不依赖(这个是无法控制的)
insert into #v
select 1, '广州区域', '广州总部营业部' union all
select 2, '番禺区域', '番禺石基营业部' union all
select 2, '番禺区域', '广州总部营业部' union all
select 3, '佛山区域', '佛山大沥营业部' select m,
max(case when id=1 then '广州区域' end) [一级区域名称],
max(case when id=2 then '番禺区域' end) [二级区域名称],
max(case when id=3 then '佛山区域' end) [三级区域名称]
from #v group by m
这个交叉表就可以的了吧?看到后面,我有点迷糊了~
(区域等级 Int,
区域名称 Nvarchar(20),
部门名称 Nvarchar(50))
Insert AA Select 1, N'广州区域', N'广州总部营业部'
Union All Select 2, N'番禺区域', N'番禺石基营业部'
Union All Select 2, N'番禺区域', N'广州总部营业部'
Union All Select 3, N'佛山区域', N'佛山大沥营业部'
GO
Declare @S Nvarchar(4000)
Select @S = ''
Select @S = @S + N', Max(Case 区域等级 When ' + Cast(区域等级 As Varchar) + N' Then 区域名称 Else '''' End) As [' + Cast(区域等级 As Varchar) + N'级区域名称 ]'
From AA Group By 区域等级
Select @S = 'Select ' + Stuff(@S, 1, 1, '') + N', 部门名称 From AA Group By 部门名称'
Print @S
EXEC(@S)
GO
Drop Table AA
--Result
/*
1级区域名称 2级区域名称 3级区域名称 部门名称
佛山区域 佛山大沥营业部
番禺区域 番禺石基营业部
广州区域 番禺区域 广州总部营业部
*/