【发布时间】: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