【问题标题】:SQL Query to Display All Columns in SSRS Report for ComparisonSQL 查询以显示 SSRS 报告中的所有列以进行比较
【发布时间】:2017-04-25 01:37:19
【问题描述】:

我一直在通过各种场所来解决这个问题,我认为我已经通过之前的问题解决了这个问题,但进一步的搜索尚未取得成果。

又快又脏:我在 SQL 2012 的单个表中有一组值,我希望所有值都显示在屏幕左侧的列中。然后,如果与左侧的列匹配,我想要一个可以具有多个值的变量来运行并显示被授予。我无法让我的 SQL 查询正常工作,但这最终会显示在 SSRS 报告中。

@GroupName 是 SSRS 报告中从可用组名称动态提取的参数。比较所需的数据存储在三个不同的表中,我无法修改数据库,因为它是 COTS 产品。

Priv_Table 包含可以分配的权限(登录、控制 a 等)及其相关 id # Info_Table 包含组的名称和组 ID # Prof_info_Table 包含与个人 Priv id # 信息匹配的组 ID #。在下面的示例中,Group 1 的 ID 将被列出 3 次,每次都与唯一的 Priv id # 相关联。 (例如 1-1、1-2、1-4)

示例:

           Group 1  Group 2   Group 3   Group 4
Log In         X       X          X        X
Control A      X                  X 
Control B                         X 
Control C      X                  X 
Delete A                                   X
Delete B                
Delete C                                   X

在上面的示例中,如果我选择 Group 1 作为要查询的组,我现有的查询将只返回左侧的 Log In、Control A 和 Control C。如果我使用第 1 组和第 3 组运行它,则控件 B 将按预期在第 1 组列中显示为空白。但是,无论选择要查询哪个组,我都希望显示所有选项。

我看到了两种前进方式,找出一种方法来提取所有数据(可能在子查询中)以始终填充一列,然后针对子查询执行 case 语句以显示所需的结果或修复现有查询。

这是我目前所拥有的以及他们每个人的问题:

    SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName, CASE WHEN
    Priv_Table.PrivilegeDesc LIKE '%' THEN 'Granted' END AS PermissionHeld
    FROM Priv_Table LEFT OUTER JOIN
    Prof_Info_Table ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID INNER JOIN
    Info_Table ON Prof_Info_Table.ProfileID = Info_Table.ProfileID
    WHERE (Info_Table.ProfileName IN (@GroupName))
    ORDER BY Priv_Table.PrivilegeID

这是我目前使用的查询,如上例所述。我在 SQL 和 SSRS 中得到了相同的行为,并且我尝试了所有不同的联接并删除了 case 语句,它仍然会发生。

如果我运行这个查询,那么我会得到所有可能的权限值:

      SELECT Priv_Table.PrivilegeDesc
      FROM Priv_Table

我尝试将其作为 SSRS 中的子报表包含在 SSRS 中,但随后我无法使用该配置进行匹配。

    SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName, CASE WHEN Exists
    (SELECT Priv_Table.PrivilegeDesc, Info_Table.ProfileName FROM Priv_Table Left Outer Join
    Prof_Info_Table ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID INNER JOIN
    Info_Table ON Prof_Info_Table.ProfileID = Info_Table.ProfileID WHERE
    Priv_Table.PrivilegeDesc like '%' ) THEN 'Granted' ELSE NULL END AS 'PermissionHeld'
    From Priv_Table, Info_Table
    WHERE (Info_Table.ProfileName IN (@GroupName))

此查询返回最左侧列的所有值,但显示所有权限已授予(或例如 X),包括该组无权访问的权限。因此,使用上面的示例,第 1 组在所有行中都会有 X,即使它应该只有登录、控制 a 和控制 C。

【问题讨论】:

  • 问你几个问题。第一个查询是删除空白行对吗?我相信我了解架构...您正在尝试使最终输出看起来像您的表格?假设这里是,列数是恒定的吗?
  • 正确,第一个查询是删除该组没有的所有行。所以组 1 只会返回登录、控制 a 和控制 c 作为左侧唯一的行。如果您在选择所有组的情况下运行查询,则左侧的所有列都会显示,但删除 B 除外。没有该访问权限的组将在他们没有权限的地方显示空白,但报告会从不显示删除 B。行数将是恒定的,但不是列数。列数取决于在报告中选择了多少组。
  • 我想我想问的是 - 组的数量是否相当小并且是静态的?还是有数百个组,因此可能有数百个列?
  • 它们因站点而异,但我认为最多可能在 70 左右,而且只有当他们选择所有组同时运行时才会这样。
  • 我认为这将很难管理。左加入您的特权表很容易(请参阅 Wes H 的回答)。让数据水平拟合将是一个更大的挑战。是否更容易将特权放在顶部,将组放在一边,还是也有很多特权?可能需要设置水平分组,但我没有玩过。可行的是创建 70 个匿名列,例如Val1、Val2...和另外 70 个标题名称列(ColHead1、ColHead2 等...)使用 PIVOT 函数适当地填充它们,然后隐藏空列。

标签: sql sql-server reporting-services sql-server-2012 ssrs-2012


【解决方案1】:

在您的查询中,您有一个左连接,然后是一个内连接。内连接也有效地将左连接转换为内连接。

这可能是您的问题的一部分,但没有样本数据很难判断。

另一种选择,创建一个不同的权限列表,然后加入您的结果。

SELECT *
FROM (
    SELECT  DISTINCT Priv_Table.PrivilegeDesc,
    FROM  Priv_Table
) AS PT
LEFT OUTER JOIN (
    SELECT  Priv_Table.PrivilegeDesc,
        Info_Table.ProfileName,
        PermissionHeld = CASE
                           WHEN Priv_Table.PrivilegeDesc LIKE '%' THEN 'Granted'    
                         END
    FROM  Priv_Table
    LEFT OUTER JOIN Prof_Info_Table
                  ON Priv_Table.PrivilegeID = Prof_Info_Table.PrivilegeID
    INNER JOIN Info_Table
             ON Prof_Info_Table.ProfileID = Info_Table.ProfileID
    WHERE (Info_Table.ProfileName IN ( @GroupName ))
) AS Profiles
ON PT.PrivilegeDesc = Profiles.PrivilegeDesc

【讨论】:

  • 效果很好。出于某种原因,在 GroupNames 开始之前我有一个空白的第一列。我曾尝试过多种类型的连接但没有成功。
  • 我假设您的 Priv_Table.PrivilegeDesc 字段中有一个空白描述。您可以尝试在不同的选择中过滤掉它,但请确保您查看它如何影响其他结果。如果个人资料没有特权,则交集应为空,而不是空白。
  • 当我进一步运行这个时,第一列并不总是空白。这取决于选择了哪些组。所以,我只是忍受它,因为我在任何地方都没有看到任何空白描述。感谢您的所有帮助。
猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多