1

SQL Server 2008 データベースに 3 つのテーブルがあります。最初のテーブルにはユーザー名が含まれ、2 番目のテーブルには権限が含まれ、最後のテーブルには最初の 2 つのテーブルがリンクされています。

USERS (ID整数、NAMEvarchar(20));

PRIVS (ID整数、NAMEvarchar(50));

USERS_PRIVS (USERID整数、PRIVID整数);

たとえば、USERS テーブルには次のものがあります。

1, Adam
2, Benjamin
3, Chris

PRIVS テーブルには次のものがあります。

1, Add Invoice
2, Edit Invoice
3, Delete Invoice

USERS_PRIVS テーブルには次のものがあります。

1, 1
1, 2
1, 3
2, 1
2, 2
3, 1

次のようなものを返す SQL クエリを作成する方法を探しています。

          Add Invoice    Edit Invoice   Delete Invoice
Adam      Y              Y              Y
Benjamin  Y              Y              N
Chris     Y              N              N

これはピボット機能を使用して可能ですか?

4

3 に答える 3

1

これがSqlFiddleのデモです。

with cl 
as (
select u.NAME , case when p.ID = 1 then 'Y' else 'N' end 'Add Invoice',
case when p.ID = 2 then 'Y' else 'N' end 'Edit Invoice',
case when p.ID = 3 then 'Y' else 'N' end 'Delete Invoice'
from USERS u inner join USERS_PRIVS up on u.ID = up.USERID
inner join PRIVS p on up.PRIVID = p.ID  
)

select NAME, MAX([Add Invoice]) 'Add Invoice', 
MAX([Edit Invoice]) 'Edit Invoice',
MAX([Delete Invoice]) 'elete Invoice'
from cl
group by NAME

これがSqlFiddleのデモです。

select NAME , case when [Add Invoice] = 1 then 'Y' else 'N' end 'Add Invoice',
case when [Edit Invoice] = 1 then 'Y' else 'N' end 'Edit Invoice',
case when [Delete Invoice] = 1 then 'Y' else 'N' end 'Delete Invoice'
from (
select u.NAME, p.NAME as pname
from USERS u inner join USERS_PRIVS up on u.ID = up.USERID
inner join PRIVS p on up.PRIVID = p.ID  
) p
pivot( count(pname) for pname in ([Add Invoice], [Edit Invoice], [Delete Invoice])) as pvt
于 2013-09-25T21:30:30.850 に答える