CTE Pivot在sql server中

时间:2014-07-03 10:05:47

标签: sql sql-server common-table-expression

我已经完成了一项任务,完成并挫败了这个语法,

我们在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

在计算它时,我如何将它们视为层次梯的一部分,但不输出它们?基本上我希望最高的扇区或服务成为每行中的最后一项

2 个答案:

答案 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)