【问题标题】:SQL Pivot Table for Many-To-Many Relationship for use in SSRS用于 SSRS 的多对多关系的 SQL 数据透视表
【发布时间】: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


【解决方案1】:

我不知道数据透视表,但您可以在 SSRS 中实现这一点,如下所示

Select UserName,
           RightName
From users u INNER JOIN RightMembership rm on rm.UserID = u.UserID
             INNER JOIN Rights r on rm.RightID = r.RightID

将此查询用作存储过程或查询以及相应的顺序和

创建数据集和数据源

在报表中插入矩阵

在行中从 Created Dataset 中选择 UserName 字段 在列中从创建的数据集中选择 RightName 字段 在下面的数据中使用此表达式,您将获得所需的输出 =IIF(Fields!UserName.Value = nothing,nothing,"X") 作为矩阵中的数据

【讨论】:

  • 效果很好。在报表向导中,我无法在详细信息区域中创建没有任何值的矩阵,因此我稍微修改了查询以添加 1 as Available 作为第三个字段。一旦我这样做并在详细信息中使用了 Available 字段,向导就会根据需要设计报告。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2018-09-23
  • 2023-02-05
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多