Как объединить несколько справочных таблиц на основе строки - PullRequest
0 голосов
/ 28 марта 2020

Предположим, что у меня есть три листа для извлечения данных, и мне нужно получить повторяющиеся данные с этих листов. По сути, для каждого пользователя в группе пользователей найдите все разрешения, связанные с другой группой, и отобразите данные разрешения. Мои листы настроены как таковые. (Предположим, вверху слева - 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

ADDT'L Info

По существу способ, которым информация должна передаваться для получения каждого из ожидаемых результатов, заключается в следующем. Для каждого имени пользователя сопоставьте имя группы с именем группы на втором листе. Оттуда Ref Table Rows скажет вам, какие строки могут быть возвращены, сопоставляя Switches (YNYNYN) с соответствующими строками таблицы ссылок из справочного листа. Порядковый номер предназначен для определения того, какое разрешение соответствует соответствующему коммутатору. 1 - первый символ, 2 - второй символ и т. Д. c .. и определяет, возвращает ли он значение 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

Есть ли способ, которым это можно сделать с помощью формулы?

1 Ответ

1 голос
/ 28 марта 2020

Попробуйте как есть:

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   |

ссылка dbfiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...