Max*_*eek 6 sql sql-server pivot
我正在使用现有数据库并尝试编写SQL查询以获取所有帐户信息,包括权限级别.这是用于安全审计.我们希望以可读的方式转储所有这些信息,以便于比较.我的问题是有一个权限的桥/链接表,所以每个用户有多个记录.我希望在一行中获得一个用户的所有权限.这是一个例子:
Table_User:
UserId UserName
1 John
2 Joe
3 James
Table_UserPermissions:
UserId PermissionId Rights
1 10 1
1 11 2
1 12 3
2 11 2
2 12 3
3 10 2
Run Code Online (Sandbox Code Playgroud)
PermissionID链接到一个具有Permission名称及其功能的表.对象就像1 =视图,2 =修改等.
我从用户1的基本查询中得到的是:
UserId UserName PermissionId Rights
1 John 10 1
1 John 11 2
1 John 12 3
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
UserId UserName Permission1 Rights1 Permission2 Right2 Permission3 Right3
1 John 10 1 11 2 12 3
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望所有用户都这样.我发现最接近的是SQL Server 2005中的Pivot函数.http: //geekswithblogs.net/lorint/archive/2006/08/04/87166.aspx 从我能说的这个问题是我需要的为每个用户命名每列,我不知道如何获得权限级别.使用真实数据,我有大约130个用户和40个不同的权限.
有没有另外一种方法只有sql,我可以做到这一点?
你可以这样做:
select userid, username
, max(case when permissionid=10 then rights end) as permission10_rights
, max(case when permissionid=11 then rights end) as permission11_rights
, max(case when permissionid=12 then rights end) as permission12_rights
from userpermissions
group by userid, username;
Run Code Online (Sandbox Code Playgroud)
您必须为每个权限显式添加一个类似的 max(...) 列。