2017-08-23 46 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