Oracle 11g SQL для разделения данных столбца как данных нескольких столбцов - PullRequest
0 голосов
/ 02 июля 2018

У меня есть требование, если данные ниже

ID            Date                 Comments
101         23/Jun/2018      RR: Insufficient resource
101         23/Jun/2018      Next week apply for leave 
102         22/Jun/2018      NULL
103         21/Jun/2018      Go ahead

Мне нужен Oracle SQL для извлечения данных выше как

ID     DATE          A_comments                    D_comments
101   23/Jun/2018    Next week apply for leave      RR: Insufficient resource
102   22/Jun/2018
103   21/Jun/2018     Go ahead

Всякий раз, когда комментарий с префиксом RR: он должен идти к D_comments, а без префикса RR он должен идти к A_comments для определенного идентификатора.

Помогите мне достичь этого.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы можете «распределить» столбцы на основе значения с помощью оператора CASE:

SELECT id, 
       date,
       case when comments not like 'RR:%' then comments end as A_comment,
       case when comments     like 'RR:%' then comments end as D_comment
  FROM my_table;

Вывод будет

ID     DATE          A_comments                    D_comments
101   23/Jun/2018    Next week apply for leave     
101   23/Jun/2018                                  RR: Insufficient resource
102   22/Jun/2018
103   21/Jun/2018    Go ahead

Поэтому вам нужно «сложить» столбцы в один ряд, например, с помощью MAX:

SELECT id, 
       date,
       MAX(case when comments not like 'RR:%' then comments end) as A_comment,
       MAX(case when comments     like 'RR:%' then comments end) as D_comment
  FROM my_table
 GROUP BY id, date;

, который будет генерировать

ID     DATE          A_comments                    D_comments
101   23/Jun/2018    Next week apply for leave     RR: Insufficient resource
102   22/Jun/2018
103   21/Jun/2018    Go ahead

EDIT:

Чтобы отразить ваш комментарий, чтобы добавить все комментарии, вы можете использовать LISTAGG вместо MAX:

SELECT id, 
       date,
       LISTAGG(case when comments not like 'RR:%' then comments end, '-'
                           WITHIN GROUP (ORDER BY comments)) as A_comment,
       MAX(case when comments like 'RR:%' then comments end) as D_comment
  FROM my_table
 GROUP BY id, date;
0 голосов
/ 02 июля 2018

Попробуйте ниже

 WITH t
     AS (SELECT 101 id_col,
                '23/Jun/2018' date_col,
                'RR: Insufficient resource' comments
           FROM DUAL
         UNION
         SELECT 101 id_col,
                '23/Jun/2018' date_col,
                'Next week apply for leave' comments
           FROM DUAL
         UNION
         SELECT 102 id_col, '22/Jun/2018' date_col, 'NULL' comments FROM DUAL
         UNION
         SELECT 103 id_col, '21/Jun/2018' date_col, 'Go ahead' comments
           FROM DUAL)
(  SELECT id_col,
          date_col,
          MAX (CASE WHEN comments NOT LIKE 'RR:%' THEN comments END)
             a_comment,
          MAX (CASE WHEN comments LIKE 'RR:%' THEN comments END) d_comment
     FROM t
 GROUP BY id_col, date_col)
ORDER BY id_col

Демонстрация SQL Fiddle

0 голосов
/ 02 июля 2018

Этот запрос работает для ваших примеров данных. Но, если есть какие-то другие неизвестные сценарии, упомянутые Алексом, отредактируйте свой вопрос, чтобы добавить его.

SELECT
    id,
    date_t,
    MAX(
        CASE
            WHEN comments LIKE 'RR:%' THEN NULL
            ELSE comments
        END
    ) a_comments,
    MAX(
        CASE
            WHEN comments LIKE 'RR:%' THEN  comments
        END
    ) d_comments
FROM
    t
GROUP BY
    id,
    date_t;

Демо

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