从SQL查询返回表

从SQL查询返回表,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我在SQLServer2008数据库中有3个表。第一个表包含用户名,第二个表包含权限,最后一个表链接前两个表: 用户(IDinteger,NAMEvarchar(20)) PRIVS(IDinteger,NAMEvarchar(50)) USERS\u PRIVS(USERIDinteger,PRIVIDinteger) 例如,“用户”表包含以下内容: 1, Adam 2, Benjamin 3, Chris Add Invoice Edit Invoice De

我在SQLServer2008数据库中有3个表。第一个表包含用户名,第二个表包含权限,最后一个表链接前两个表:

用户
ID
integer,
NAME
varchar(20))

PRIVS
ID
integer,
NAME
varchar(50))

USERS\u PRIVS
USERID
integer,
PRIVID
integer)

例如,“用户”表包含以下内容:

1, Adam
2, Benjamin
3, Chris
          Add Invoice    Edit Invoice   Delete Invoice
Adam      Y              Y              Y
Benjamin  Y              Y              N
Chris     Y              N              N
PRIVS表有:

1, Add Invoice
2, Edit Invoice
3, Delete Invoice
1, 1
1, 2
1, 3
2, 1
2, 2
3, 1
USERS_PRIVS表具有:

1, Add Invoice
2, Edit Invoice
3, Delete Invoice
1, 1
1, 2
1, 3
2, 1
2, 2
3, 1
我正在寻找一种创建SQL查询的方法,该查询将返回以下内容:

1, Adam
2, Benjamin
3, Chris
          Add Invoice    Edit Invoice   Delete Invoice
Adam      Y              Y              Y
Benjamin  Y              Y              N
Chris     Y              N              N
使用pivot功能可以实现这一点吗?

这里有一个演示

这里有一个演示

试试这个:

select 
    name,
    CASE [1] WHEN 1 THEN 'Y' ELSE 'N' END as 'Add Invoice', 
    CASE [2] WHEN 1 THEN 'Y' ELSE 'N' END as 'Edit Invoice', 
    CASE [3] WHEN 1 THEN 'Y' ELSE 'N' END as 'Delete Invoice'
from 
    (select name, userId, privid, 1 temp from users_privs join users on id = userid) as sourceTable
    pivot( min(temp) for privid in ([1], [2], [3])) as pivotTable
编辑1: 然后,您将不得不使用一些动态sql

DECLARE @query AS NVARCHAR(MAX);
DECLARE @privColumnNames AS NVARCHAR(MAX);

select @privColumnNames = STUFF((SELECT distinct ',' + QUOTENAME(Name)
                                    FROM PRIVS FOR XML PATH(''), TYPE
                                ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SELECT @query =
'SELECT *
FROM
(SELECT U.Name AS Name, P.Name AS PrivName FROM USERS_PRIVS UP
    INNER JOIN Users U ON UP.UserID = U.id
    INNER JOIN Privs P ON UP.PrivID = P.id) SB
PIVOT(
 count(SB.PrivName)
 FOR SB.PrivName in ( ' + @privColumnNames + ' )) AS Results ';

 execute(@query);

我从这里借用了XML内容

是的。在这个网站和网络上有很多关于透视的例子;你试过什么?@JonofAllTrades:我试过很多不同的支点建议。我遇到的问题是从PRIVS表中获取列标题,而不是像下面所有建议那样在SQL中硬编码。这是可行的,但我希望避免将每个特权名称硬编码为列标题。有没有办法根据表中的权限动态设置列名?您的第二个脚本可以工作,但我希望避免将每个权限名硬编码为列标题。有没有一种方法可以根据表中的权限动态设置列名?这是可行的,但我希望避免将每个权限名硬编码为列标题。有没有办法根据表中的权限动态设置列名?@Caynadian请参见编辑1。它使用动态sql从Privs表中获取列列表