我已经完成了一项任务,完成并挫败了这个语法,
我们在SQL Server中的数据库有一个带有6列的不规则层次结构,我创建了一些插入代码以使其完美。
所需的输出是为每个低于100的CostCentreID找到顶层 - 并且跳过isservice和issector都设置为0的任何层,你可以在我想要的输出中看到ignoreme和corp服务行不应该出来 - 我需要它水平旋转,以便CostCentres位于顶部。
CREATE table #test
(
ParentID int,
CostCentre varchar(max),
CostCentreID int,
CostCentreCode varchar(max),
ISService bit,
ISSector bit
)
GO
INSERT into #test VALUES(10289,'Legal',88,'0107',0,0)
INSERT into #test VALUES(10291,'ML Corp',10289,'MLCorpServ',0,1)
INSERT into #test VALUES(10292,'IgnoreMe',10291,'MLCorpServ',0,0)
INSERT into #test VALUES(10000,'Corp Services',10292,'CorpSvcs',1,0)
INSERT into #test VALUES(10000,'Corp Services Top',10000,'CorpSvcstop',0,0)
期望的输出:
Parent1, Parent2, Parent 3, Parent4
Legal ML Corporate Services Corporate Services xxxxxetc
令人讨厌的是,每个层面都有不同数量的潜在父母 - 我认为最多是9个父母。
有人可以帮助我转动数据并弄明白吗?
此致
Ĵ
你好
我99%有Jayvee谢谢你的帮助。
我的输出如下:
88,10289
88,10289,10291
88,10289,10291,10292
88,10289,10291,10292,10000
所需的行是:
88,10289,10292 - 因为10291和10000都有0,0 for isservice和issector
在计算它时,我如何将它们视为层次梯的一部分,但不输出它们?基本上我希望最高的扇区或服务成为每行中的最后一项
答案 0 :(得分:1)
你可以left join
九次:
select child
, parent1.name
, parent2.name
, parent3.name
...
from YourTable child
left join
YourTable parent1
on parent1.ID = child.ParentID
left join
YourTable parent2
on parent2.ID = parent1.ParentID
left join
YourTable parent3
on parent3.ID = parent2.ParentID
....
答案 1 :(得分:0)
另一个需要考虑的选项是使用CTE的字符串构建器,如下所示:
WITH r AS (
SELECT CAST(CostCentreid AS VARCHAR(max)) + ',' + CAST(parentid AS VARCHAR(max)) sb
FROM #test
UNION ALL
SELECT sb +',' + CAST(parentid AS VARCHAR(max))
FROM r
JOIN #test t ON rtrim(CAST(t.costcentreid AS VARCHAR(max)))=rtrim(right(r.sb,CHARINDEX(',',reverse(r.sb))-1))
WHERE t.parentid<>t.costcentreid
)
SELECT * FROM r
OPTION (MAXRECURSION 0)