将行转置到列并使值在TSQL中向下流动

时间:2017-08-23 20:13:03

标签: sql sql-server tsql pivot transpose

我正在使用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 个答案:

答案 0 :(得分: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 :(得分:0)

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

这是一个标准的递归CTE,在最终的SELECT

中有一点点扭曲

示例

;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