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
我一直在通过各种渠道解决这个问题,我认为我已经解决了之前的问题,进一步的搜索还没有结果。
快速而简单:我在 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