2012-04-16 7 views
3

を平坦化:T-SQLクエリ:私は下のこのシナリオを解決するためのクエリを構築する必要があり、テーブル

ParentTable:

ParentId Name 
1   Parent A 
2   Parent B 

ChildTable:

ChildId ParentId Name 
10  1   Child X 
11  1   Child Y 
12  1   Child Z 
13  2   Child Q 

単一の親複数の子供にリンクすることができます。クエリでは、次の結果が得られます。

Parent Name 1st-Child 2nd-Child 3rd-Child 4th-Child 5th-Child 
Parent A  Child X  Child Y  Child Z 
Parent B  Child Q 

これはMS SQL 2008では可能ですか?

+5

これは可能ですが、あなたは5人の子供しかいないことをどのように知っていますか?なぜこの正常に正規化されたデータを非正規化する必要がありますか? – JNK

+0

元々この形式(スプレッドシート)のデータがあり、それが解析され、別のプロセスによってデータベースに挿入されます。その挿入されたデータをデータベースから取り出し、元のファイルの外観を模倣して新しいスプレッドシートを作成する必要があるため、データベース内のすべてが正しいことを確認できます。 – John

答えて

6

あなただけの今までに5人の子供をリストする必要があり、このクエリが動作すると仮定:

with T as (
    select P.Name as ParentName, 
      C.Name as ChildName, 
      row_number() over (partition by P.ParentId order by C.ChildId) as N 
    from ParentTable P join ChildTable C on P.ParentId = C.ParentId 
) 
select ParentName, 
    max(case when N = 1 then ChildName else '' end) as '1st-child', 
    max(case when N = 2 then ChildName else '' end) as '2nd-child', 
    max(case when N = 3 then ChildName else '' end) as '3rd-child', 
    max(case when N = 4 then ChildName else '' end) as '4th-child', 
    max(case when N = 5 then ChildName else '' end) as '5th-child' 
from T 
group by ParentName 
+0

私は最初にこれを動作させるのに問題がありましたが、私はrow_number()のパーティションピースがありませんでした。完璧な作品、ありがとう! – John

3

PIVOTはあなたのシナリオのために設計されました。

SELECT * FROM 
(
    SELECT [Parent] = P.Name, 
     [Child] = C.Name, 
     [Field] = 'Child ' + LTRIM(STR(
     ROW_NUMBER() OVER (PARTITION BY C.ParentId ORDER BY C.ChildId))) 
    FROM ChildTable C 
    JOIN ParentTable P ON P.ParentId = C.ParentId 
) A 
PIVOT (MAX([Child]) 
     FOR [Field] IN ([Child 1], [Child 2], [Child 3], [Child 4], [Child 5])) B 
関連する問題