2017-08-23 7 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回呼び出されます。それは望ましい結果をもたらさない場合(これはギザギザの階層ではありませんと仮定)テキストとしてデータを追加し、私に知らせて、私は、クエリ

+1

を選択私はあなたを検証ソリューションとそれはうまく動作します。 +1結合は私に起こらなかった –

+0

はい、これは私が必要としているように見えます!ありがとうHoraciux! –

0

別のオプションを変更することができてください

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 

:これを試してみてください。

これは、標準的な再帰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

関連する問題