【发布时间】:2012-03-05 21:00:23
【问题描述】:
使用 SQL Server 2008,我试图弄清楚如何创建一个查询,该查询返回具有标准多对多关系的数据透视表。这种关系定义了哪些用户属于哪些角色,我希望表格在侧面列出用户名,在顶部列出角色名。最终目标是在 SQL Server Reporting Services 中提供此输出,因此无论是 SQL Server 生成数据透视结果还是 SSRS 生成结果(一种方法比另一种更好吗?)都没有关系。这是我的示例架构:
用户表:
- 用户 ID
- 用户名
权利表:
- RightID
- 权利名称
RightsMembership 表:
- 用户 ID
- RightID
我想要以下输出作为 SSRS 中的报告。任何帮助表示赞赏。
RightOne RightTwo RightThree RightFour
jdoe X X
mjane X X
ssmith X X X
仅供参考:可以添加角色,因此我不希望在查询中硬编码角色名称或计数。
【问题讨论】:
-
如果我在大约 3 小时后回到家时没有回答这个问题,我将开始回答它。如您所知,我正在考虑的解决方案将需要一个运行动态 SQL 的存储过程和您的报告中的一个矩阵。
-
谢谢杰里米。我发现一个站点显示的内容类似于我在 SQL Server 中使用“pivot”命令想要的内容,但他使用的示例与我正在寻找的内容不完全匹配(一对多关系)。对此blogs.msdn.com/b/spike/archive/2009/03/03/… 有任何想法吗?
-
PIVOT 要求每个列都明确命名它要创建的。因此,您需要动态创建查询。 SELECT DISTINCT RightsName FROM Rights 将为您提供可用于构建查询字符串的列表。然后使用 sp_executesql 运行动态查询。在 SSRS 中使用带有列组的矩阵将允许动态计算列。当我回到家时,我会在答案中更详细地澄清所有这些。 :)
-
另外,您希望列表仅限于当前用户可以看到的权限吗?例如,您发送一个 UserId,它会为您提供一个包含每个用户的表,以及他们是否拥有 UserId 有权访问的每个权限?还是您只想获取每个用户与每个权利的比较?
-
正如 Jeremy 所观察到的,在 SQL 中进行透视要求必须明确指定每一列,这需要事先不知道这些的动态 SQL。动态 SQL 让人头疼;以 SSRS 为中心是要走的路。
标签: sql-server reporting-services pivot-table