SQL 显示 SSRS 报告中所有列以进行比较的查询

SQL Query to Display All Columns in SSRS Report for Comparison

我一直在通过各种渠道解决这个问题,我认为我已经解决了之前的问题,进一步的搜索还没有结果。

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

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

Priv_Table 包含可以分配的权限(登录、控制 a 等)及其相关的 id # Info_Table 包含群组名称和群组 ID # Prof_info_Table 包含与个人 Priv id # 信息匹配的组 id #。在下面的示例中,第 1 组的 ID 将被列出三次,每次都与唯一的 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

在上面的示例中,如果我选择第 1 组作为要查询的组,则我现有的查询只会 return 左侧的登录、控件 A 和控件 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))

此查询 returns 最左侧列的所有值,但是显示 g运行ted(或示例中的 X)所有权限,包括组没有的权限进入。因此,使用上面的示例,第 1 组在所有行中都有 X,即使它应该只有登录、控制 a 和控制 C。

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

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

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

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