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

时间:2016-12-09 14:33:51

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

我一直在各种各样的场地工作,我以为我用之前的问题解决了这个问题,而且进一步的搜索还没有结果。

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

@GroupName是从可用组名动态提取的SSRS报告中的参数。比较所需的数据存储在三个不同的表中,我无法修改数据库,因为它是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

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

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

这是我到目前为止所遇到的问题以及每个问题:

    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 个答案:

答案 0 :(得分:1)

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

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

另一个选项是,创建一个不同的权限列表,然后保持联接到您的结果。

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