excel - 如何基于字符串连接多个引用表
问题描述
假设给了我三张表来从中提取数据,我需要从这些表中获取重复数据。基本上对于用户组中的每个用户,查找与另一个组关联的所有权限并显示给定的权限。我的床单就是这样设置的。(假设左上角是A1)
第一个表(用户表)
Username Group
GPARR11 ACC-ADMIN
LPARR11 PRT-MGR
CSMITH VP-SALES
第二个表(权限表)
Group Ref Table Rows Switches
ACC-ADMIN 500 YNYNNNYN
ACC-ADMIN 502 YNYYY
ACC-ADMIN 503 NYNYYN
PRT-MGR 500 NNNYNNNYN
PRT-MGR 633 YNYNNNYNNY
VP-Sales 500 NYNYNNNYNY
VP-Sales 999 NYNYNYNYNYNNYNNYNYNN
决赛桌(参考表)
这张表从第二张表的第三列中得到它的引用。因此,如果一个角色是Y
,那么它启用了该权限,N
那么它没有。
Ref Table Switch Row Sequenc # Permission
500 1 Access G&B
500 2 Access Call
500 3 Access A/R
633 1 Modify G&B
633 2 Modify Call
633 3 Modify Memos
999 1 Delete G&B
我期待看到的
Username Group Permission Enabled
GPARR11 ACC-ADMIN Access G&B TRUE
Access Call FALSE
Access A/R TRUE
LPARR11 PRT-MGR Access G&B FALSE
Access Call FALSE
Access A/R FALSE
Modify G&B TRUE
Modify Call FALSE
Modify Memos TRUE
CSMITH38 VP-SALES Access G&B FALSE
Access Call TRUE
Access A/R FALSE
添加信息
本质上,信息应该流以获取每个预期输出的方式如下。对于每个用户名,将他们的组名与第二张表中的组名匹配。从那里Ref Table Rows
将告诉您允许返回哪些行,将Switches
(YNYNYN)
与参考表中的相应 Ref Table Rows 映射。序列号用于确定哪个权限与相应的 Switch 匹配。1 是第一个字符,2 是第二个字符,依此类推。并确定它在输出上返回 true 还是 false。
查看权限表中GPARR11
的ACC-ADMIN
匹配项。ACC-ADMIN
有三个Ref Table Rows
与ACC-ADMIN
, 500
, 502
,相关联503
。每行都有Switches
对应的Reference Table
. 因此它将从500
, 502
,中提取所有权限503
,然后检查switch
以确定每个权限是否ref rows
是TRUE
或FALSE
有没有办法用公式来做到这一点?
解决方案
试试这个:
WITH
TAB1 (Username, Group) AS
(VALUES
('GPARR11', 'ACC-ADMIN')
, ('LPARR11', 'PRT-MGR ')
, ('CSMITH ', 'VP-SALES ')
)
, TAB2 (Group, Ref, Switches) AS
(
VALUES
('ACC-ADMIN', 500, 'YNYNNNYN')
, ('ACC-ADMIN', 502, 'YNYYY')
, ('ACC-ADMIN', 503, 'NYNYYN')
, ('PRT-MGR ', 500, 'NNNYNNNYN')
, ('PRT-MGR ', 633, 'YNYNNNYNNY')
, ('VP-SALES ', 500, 'NYNYNNNYNY')
, ('VP-SALES ', 999, 'NYNYNYNYNYNNYNNYNYNN')
)
, TAB3 (Ref, Sequence, Permission) AS
(
VALUES
(500, 1, 'Access G&B ')
, (500, 2, 'Access Call ')
, (500, 3, 'Access A/R ')
, (633, 1, 'Modify G&B ')
, (633, 2, 'Modify Call ')
, (633, 3, 'Modify Memos')
, (999, 1, 'Delete G&B ')
)
SELECT
CASE WHEN ROWNUMBER() OVER (PARTITION BY T1.Username, T2.Group ORDER BY T3.Sequence) = 1 THEN T1.Username ELSE '' END Username
, CASE WHEN ROWNUMBER() OVER (PARTITION BY T1.Username, T2.Group ORDER BY T3.Sequence) = 1 THEN T2.Group ELSE '' END Group
, T3.Permission, DECODE(T.Flag, 'Y', 'TRUE', 'FALSE') Enabled
FROM TAB1 T1
JOIN TAB2 T2 ON T2.Group = T1.Group
CROSS JOIN xmltable
(
'let $n := substring(replace($s, "(.)", " $1"), 2) for $id in tokenize($n, " ") return <i>{string($id)}</i>'
passing
t2.switches as "s"
columns
seq for ordinality
, flag char(1) path '.'
) T
JOIN TAB3 T3 ON T3.Ref = T2.Ref AND T3.Sequence = T.Seq
ORDER BY T1.Username, T2.Group, T3.Sequence;
结果是:
|USERNAME|GROUP |PERMISSION |ENABLED|
|--------|---------|------------|-------|
|CSMITH |VP-SALES |Access G&B |FALSE |
| | |Delete G&B |FALSE |
| | |Access Call |TRUE |
| | |Access A/R |FALSE |
|GPARR11 |ACC-ADMIN|Access G&B |TRUE |
| | |Access Call |FALSE |
| | |Access A/R |TRUE |
|LPARR11 |PRT-MGR |Access G&B |FALSE |
| | |Modify G&B |TRUE |
| | |Access Call |FALSE |
| | |Modify Call |FALSE |
| | |Access A/R |FALSE |
| | |Modify Memos|TRUE |
推荐阅读
- mysql - 带有 Kotlin 暴露错误的 MySQL 连接表:“没有匹配的主/外键对”
- java - 在 JAX-RS 应用程序中手动注册资源类有什么好处?
- java - 当应用程序停止时,我们能否检测到 toString() 被调用以响应调试器请求?
- python - Django2/Python3:Django 在排序 dict() 时引发 TypeError
- node.js - 用类组织 express.Router?
- javascript - JavaScript 准确地跟踪哪些键被关闭
- mongodb - mongodb TTL索引可以用于查询吗?
- javascript - 每次调用 else 语句
- c - MPI 启动这么多进程有多准确
- c - 调试子进程不使用 set detach-on-fork off