0

ピボット クエリの作成に問題があります。

私はこのデータを持っています:

DECLARE @UserAccess TABLE
(
    userName char(255),
    project char(255),
    role char(255)
);

userName  project  role
--------  -------  ----
ado       BI       U
aga       BI       D
aga       BI       U
mim       BI       A
mim       BI       U
ado       BID      D
ado       BID      U
aga       BID      D
aga       BID      U
mim       BID      A
mim       BID      D
mim       BID      U

私が欲しいのはこれです:

User    BI    BID
-----   ---   ---
ado     U     DU
aga     DU    DU
mim     AU    ADU

しかし、これを取得するためのステートメントを作成する方法がわかりません。

4

1 に答える 1

1

まず、 を 1 つの行に連結する必要がありますroles。次に、PIVOT 関数を適用できます。

select username, BI, BID
from
(
  select username, project, 
    STUFF((SELECT distinct '' + t.[role]
         from UserAccess t
         where u.username = t.username
           and u.project = t.project
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') role
  from UserAccess u
) d
pivot
(
  max(role)
  for project in (BI, BID)
) piv;

SQL Fiddle with Demoを参照してください。

CASEこれは、式を含む集計関数を使用して記述することもできます。

;with cte as
(
  select username, project, 
    STUFF((SELECT distinct '' + t.[role]
         from UserAccess t
         where u.username = t.username
           and u.project = t.project
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') role
  from UserAccess u
)
select username,
  max(case when project = 'BI' then role end) BI,
  max(case when project = 'BID' then role end) BID
from cte
group by username;

デモで SQL Fiddle を参照してください

于 2013-04-05T15:02:13.737 に答える