Нужно объединить несколько строк в одну ячейку с помощью SQL? - PullRequest
0 голосов
/ 04 ноября 2011

В настоящее время я написал:

SELECT IT_ID, SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2) GROUPS
FROM (SELECT U.IT_ID, LAST_NAME, FIRST_NAME, GRP, ROW_NUMBER() OVER (ORDER BY U.IT_ID) rn, COUNT(*) OVER() cnt
FROM ECG_IT_USERS U
JOIN SECUREGROUPS G ON U.IT_ID = G.IT_ID)

START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1

Это возвращает:

IT_ID   GROUPS

afz23   ADMIN
afz23   ADMIN,QA
alv77   ADMIN,QA,USER
jaj23   ADMIN,QA,USER,USER
klo26   ADMIN,QA,USER,USER,PROD
klo26   ADMIN,QA,USER,USER,PROD,ADMIN
klo26   ADMIN,QA,USER,USER,PROD,ADMIN,QA
mav45   ADMIN,QA,USER,USER,PROD,ADMIN,QA,ADMIN

Я не могу понять, как я могу сделать его сброс после встречи с новым пользователем?Кажется, он переносит предыдущие группы, даже если пользователь не принадлежит им.

Мне нужно увидеть:

IT_ID   GROUPS

afz23   ADMIN,QA
alv77   USER
jaj23   USER
klo26   PROD,ADMIN,QA
mav45   ADMIN

1 Ответ

0 голосов
/ 05 ноября 2011

Здесь нужно сделать три вещи.

Сначала вам нужно добавить раздел в функцию row_number, чтобы она начинала нумерацию с 1 для каждого IT_ID.Вам также необходимо добавить в соединение столбец IT_ID, чтобы он принимал только строки с одинаковым значением IT_ID.Наконец, вам нужно сгруппировать по столбцу it_id, чтобы удалить повторяющиеся строки.

Окончательный запрос будет

with ECG_IT_USERS as (
  select 'afz23' as it_id from dual union all
  select 'alv77' as it_id from dual union all
  select 'jaj23' as it_id from dual union all
  select 'klo26' as it_id from dual union all
  select 'mav45' as it_id from dual
),
securegroups as (
  select 'afz23' as it_id, 'ADMIN' as grp from dual union all
  select 'afz23' as it_id, 'QA' as grp from dual union all
  select 'alv77' as it_id, 'USER' as grp from dual union all
  select 'jaj23' as it_id, 'USER' as grp from dual union all
  select 'klo26' as it_id, 'PROD' as grp from dual union all
  select 'klo26' as it_id, 'ADMIN' as grp from dual union all
  select 'klo26' as it_id, 'QA' as grp from dual union all
  select 'mav45' as it_id, 'ADMIN' as grp from dual
)
SELECT 
  IT_ID, 
  Max(SUBSTR (SYS_CONNECT_BY_PATH (grp , ','), 2)) GROUPS
FROM (
  SELECT 
    U.IT_ID, 
--    LAST_NAME, 
--    BFIRST_NAME, 
    GRP, 
    ROW_NUMBER() OVER (partition by u.it_id ORDER BY U.IT_ID) rn, 
    COUNT(*) OVER() cnt
FROM ECG_IT_USERS U
JOIN SECUREGROUPS G ON (U.IT_ID = G.IT_ID))
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1 and it_id = prior it_id
Group by it_id

. Это даст мне следующий вывод:

IT_ID GROUPS
----- --------------------
alv77 USER
afz23 ADMIN,QA
jaj23 USER
mav45 ADMIN
klo26 PROD,ADMIN,QA

РЕДАКТИРОВАТЬ : я добавил спредложение с некоторыми примерами данных, и это работает для меня без каких-либо проблем, хотя я закомментировал столбцы last_name и first_name, поскольку они не влияют на окончательный запрос, и я поставил несколько скобок вокруг условия соединения.

Возможно, стоило бы начать с запроса, который я получил выше, проверить, работает ли он изначально для вас, и изменить его соответствующим образом.

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