2017-08-23 38 views
1

我正在使用TSQL。将行转换为列并使值在TSQL中流动

如果我有以下结果:

enter image description here

我要转这个是这样的:

enter image description here

我怎样才能做到这一点?

我有以下查询:

WITH q AS (
    SELECT * 
    FROM tableOne 
    WHERE ID = 1 
    UNION ALL 
    SELECT m.* 
    FROM tableOne m 
    JOIN ON m.ParentID = q.ID 
) 
SELECT * 
FROM q 

这给了我一切,包括指定的节点指定的节点下的项目。

回答

2

如果添加脚本数据而不是图像,我们可以很容易地为您提供帮助。请注意,tbl是您的表的名称,它被称为3次。试试这个:

select 
    a.fieldValue company, 
    b.fieldValue department, 
    c.fieldValue Job 
from tbl a 
inner join tbl b on a.parentId is null and a.id=b.parentID 
inner join tbl c on b.id= c.parentID 

如果它没有带来预期的效果,请添加数据的文字,让我知道,我可以修改查询

+1

只是为了好玩我确认你解决方案,它工作得很好。 +1加入我没有发生 –

+0

是的,这似乎是我所需要的!谢谢Horaciux! –

0

另一种选择(假设这不是一个锯齿层次)。

这是一个标准的递归CTE,在最后一点点扭曲选择

;with cteP as (
     Select ID 
      ,ParentID 
      ,PathID = cast(FieldValue as varchar(max)) 
     From YourTable 
     Where ParentID is Null 
     Union All 
     Select ID = r.ID 
      ,ParentID = r.ParentID 
      ,PathID = cast(p.PathID+'|||'+r.FieldValue as varchar(max)) 
     From YourTable r 
     Join cteP p on r.ParentID = p.ID) 
Select ID 
     ,B.* 
From cteP A 
Cross Apply (
       Select Company = xDim.value('/x[1]','varchar(max)') 
         ,Department = xDim.value('/x[2]','varchar(max)') 
         ,Job  = xDim.value('/x[3]','varchar(max)') 
       From (Select Cast('<x>' + replace(PathID,'|||','</x><x>')+'</x>' as xml) as xDim) as X 
      ) B 
    Where ID not in (Select Distinct ParentID from YourTable where ParentID is not null) 
    Order By PathID 

返回

enter image description here