asp.net - 带条件的 SQL Group By

标签 asp.net sql-server vb.net group-by

场景:我需要为 ASP.Net 应用程序的审计员创建报告。我有一个程序可以解析授权标记目录中 web.config 文件的 XML,并创建一个报告,提供哪些用户可以访问站点结构中的哪个文件夹。报告如下所示。

UserName, Firstname, LastName, Directory, Roles, Access, LastLoginDate

enter image description here

问题:正如您从报告中看到的那样,某些目录(其中包含 GISMO 的中间列)显示两次,允许和拒绝用户。我想知道是否有一种方法可以将结果分组,如果有一行允许目录,则不显示拒绝的,否则会显示。

或者,如果这可以在 VB.net/C# 中操作,那也是一个选项。它返回那里并被输入到 Excel 电子表格中。

感谢任何帮助。提前致谢。

编辑:我应该解释得更好。如果目录中不允许用户,我仍然需要拒绝行来显示。但如果它们被允许,那么显示拒绝行就没有意义了。

最佳答案

这适用于 Oracle 数据库,因此据我所知,它应该可以在 SQL Server 上运行或让您接近 SQL Server 支持其主要组成部分,即 CASE 操作。

CREATE TABLE user_permissions (
     user_role   VARCHAR2(10) NOT NULL,
     dir         VARCHAR2(10) NOT NULL,
     user_access VARCHAR2(5)  NOT NULL
);

INSERT INTO user_permissions VALUES ('admin', 'dir1', 'allow');
INSERT INTO user_permissions VALUES ('admin', 'dir2', 'allow');
INSERT INTO user_permissions VALUES ('power', 'dir1', 'allow'); -- Allow and Deny dir1
INSERT INTO user_permissions VALUES ('power', 'dir1', 'deny');
INSERT INTO user_permissions VALUES ('power', 'dir2', 'deny');
COMMIT;


SELECT UNIQUE j.*
FROM (
       SELECT user_role, dir,
              MAX(CASE user_access WHEN 'allow' THEN 1 ELSE 0 END) allowFlag,
              MAX(CASE user_access WHEN 'deny'  THEN 1 ELSE 0 END) denyFlag
       FROM user_permissions
       GROUP BY user_role, dir
     ) t
JOIN user_permissions j ON (t.user_role = j.user_role AND t.dir = j.dir)
WHERE j.user_access = 'allow' OR (t.allowFlag = 0 and user_access = 'deny');

结果:

USER_ROLE  DIR        USER_ACCESS 
---------- ---------- ----------- 
admin      dir1       allow       
admin      dir2       allow       
power      dir1       allow       
power      dir2       deny        

基本上,您使用数据透视表将多行聚合成描述目录属性的一行。获得聚合行后,很容易比较您声明的属性以连接要显示的行。

关于asp.net - 带条件的 SQL Group By,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082871/

相关文章:

c++ - 我们可以像在 C++ 中一样使用十六进制字节和字符吗?

c# - 将货币导出到 Excel 会导致空格字符

c# - 找不到 CodeDom 提供程序类型 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"

sql-server - SSAS 2005 : working with database slow after processing

sql - 在表的所有列中搜索某个值?

sql-server - 实现维度时态表以跟踪更改

asp.net - 使用 ASP.net 和 Access 数据库从 SQL 注入(inject)中保护网站

SQL - 添加/禁用基于 Select 语句中的 bool 条件的 Where 子句 (ASP.net SQLDataSource)

c# - .NET XMLDocument 编码问题

vb.net - 根据 TextBox 值选择 DevExpress GridView 上的整行