1

こんにちは、N が最大 3 である 1-N の関係を持つ 2 つのテーブルがあります。グループには、少なくとも 1 人のユーザーと最大 3 人のユーザーがいます。選択クエリを使用して、グループとすべての可能なユーザーを単一の行に表示したいと思います。

グループ :

ID  Name
1   Group1
2   Group2

ユーザー :

ID  Username IDGroup
1   User1    1
2   User2    2
3   User3    1
4   User4    1

結果 (表示するユーザー名がない場合は、null または空の文字列で問題ありません):

IDGroup GroupName Username1 Username2 Username3
1       Group1    User1     User3     User4
2       Group2    User2     Null      Null
4

2 に答える 2

2

Pivotを使用できます。

select P.IDGroup,
       P.GroupName,
       P.[1] as Username1,
       P.[2] as Username2,
       P.[3] as Username3
from 
  (
  select G.ID as IDGroup,
         G.Name as GroupName,
         U.Username,
         row_number() over(partition by G.ID order by U.Username) as rn
  from Groups as G
    left outer join Users as U
      on G.ID = U.IDGroup
  ) as T
pivot
  (
  max(T.Username) for T.rn in ([1],[2],[3])
  ) as P

SQL フィドル

アップデート:

必要なフィールドがさらにある場合は、代わりにこのようにします。

select T.IDGroup,
       T.GroupName,
       max(case when T.rn = 1 then T.Username end) as Username1,
       max(case when T.rn = 1 then T.Email end) as Email1,
       max(case when T.rn = 2 then T.Username end) as Username2,
       max(case when T.rn = 2 then T.Email end) as Email2,
       max(case when T.rn = 3 then T.Username end) as Username3,
       max(case when T.rn = 3 then T.Email end) as Email3
from (
     select G.ID as IDGroup,
            G.Name as GroupName,
            U.Username,
            U.Email,
            row_number() over(partition by G.ID order by U.Username) as rn
     from Groups as G
       left outer join Users as U
         on G.ID = U.IDGroup
     ) as T
group by T.IDGroup,
         T.GroupName
于 2013-04-02T08:37:28.873 に答える